我有一个指令,用于控制器中的三个不同范围。现在我想在一个指令中调用一个函数,它将改变其他指令中的值。
result=[ { "_id":"1", "field1":"foo","field2":"xyz", "field3":"something" ...},
{ "_id":"4", "field1":"bar","field2":"lmn", "field3":"something" ...}]
在上面的代码中,当我在指令1中调用// HTML
<my-directive instance-type="obj1"></my-directive>
<my-directive instance-type="obj2"></my-directive>
<my-directive instance-type="obj3"></my-directive>
// Directive
return {
restrict: 'E',
scope: {
controller: '=instanceType'
},
templateUrl: 'app/pages/class/templates/list.html',
link: function (scope, element, attrs) {
// Bind controller value
scope.currentId = scope.controller.currentId;
scope.nav = function(newId) {
scope.controller.nav(newId);
};
}
// Controller
$scope.obj1 = {};
$scope.obj2 = {};
$scope.obj3 = {};
$scope.obj1.nav = function(newId){$scope.obj2.currentId = newId;}
函数时,指令2中的变量nav
不会改变。
如何克服这个问题?
答案 0 :(得分:0)
您可以在指令中使用$ watch
scope.$watch('trigerVariable', function(newValue, oldValue) {
//change your variable
}, true);
当你在控制器中改变trigerVariable时,它会转移这个指令代码。
答案 1 :(得分:0)
var id1 = 1;
var id2 = 2;
id1 = 3;
// What do you expect to print for id2 variable? Does it change? No.
alert(id2);
就像上面的示例一样,您的scope.currentId
是原始类型。当scope.controller.currentId
值通过function(newId){$scope.obj2.currentId = newId;}
更改为obj2指令时,除非指令再次加载,否则scope.currentId
无法更新。
在这种情况下,您可以做两件事:
scope.currentId
并直接将scope.controller
用于currentId。controller.currentId
,并将新值设置为scope.currentId
。scope.$watch('controller.currentId', function(newValue, oldValue) {
scope.currentId = newValue;
})
请参阅此Plunker。