我在ng repeat中有一个指令。此指令生成一个唯一命名的属性,并将其设置为从服务器检索为JSON的对象。我会在一个给定的页面上有多个ng重复部分,里面有我的自定义指令
在这个页面的主控制器中,我需要响应这些指令中的事件,并更新页面上的其他元素。我不能完全控制事件(它们是第三方控制),所以我不能真正修改它们的参数或任何东西。此指令创建的属性包含我需要从控制器中获得的信息,以便决定如何响应它们。
当我在主控制器上激发事件时,在$scope上看不到这些新属性。如果我把元素从ng重复中移出,我确实看到了它们。我的指令没有使用隐藏范围。
下面是我正在做的一个简单版本:
<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@*" data-semver="1.3.0-beta.5" src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
<script>
var app = angular.module('TestApp', []);
app.controller('TestController', ['$scope', function($scope) {
$scope.list = [];
$scope.list.push({ sample: "item" });
console.log('controller called');
$scope.doSomething = function() {
console.log('doSomething called');
console.log($scope["myVariable"]);
$scope.list = [];
$scope.list.push({ sample: "item" });
};
}]);
app.directive('testDirective', ['$http', function ($http) {
return {
restrict: 'A',
scope: false,
link: function (scope, element, attrib) {
var setValue = function() {
scope["myVariable"] = "TEST!" + Date();
console.log('myVariable is set.');
};
setValue();
}
};
}]);
</script>
</head>
<body ng-app="TestApp">
<div ng-controller="TestController">
<div >
<div ng-repeat="item in list" >
<a href="#" test-directive ng-click="doSomething()">Click</a>
</div>
</div>
</div>
</body>
</html>
这是Plunker 上的相同代码
你能帮助理解为什么会发生这种情况吗?
我在这里看到了其他问题的两个可能的解决方案——第一,我可以创建一个由该指令共享的控制器。这并不理想,因为我需要能够以不同的方式连接这些指令。其次,我发现我可能会使用一个服务来共享这些数据,因为它是一个单例,但这有点困扰我——我真的更希望它保持"本地",而不是这个控制器/作用域(但我可能别无选择)。
您不应该直接访问指令中的父作用域项。应该传入要设置或修改的变量。
scope: {
'testDirective': '='
},
link: function (scope, element, attrib) {
var setValue = function() {
scope.testDirective = "TEST!" + Date();
console.log('myVariable is set.');
};
setValue();
}
该属性中应该始终有一个点。
<a href="#" test-directive="data.myVariable" ng-click="doSomething()">Click</a>
现在在控制器上可用作data.myVariable
Plunkr