У меня есть директива, которая используется в трех разных областях в контроллере. Теперь я хочу вызвать функцию в одной директиве, она изменит значение в других директивах.
// 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;}
В приведенном выше коде, когда я вызываю функцию nav
в директиве 1, переменная currentId
в директиве 2 не изменяется.
Как преодолеть эту проблему?
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
изменяется для директивы obj2 через function(newId){$scope.obj2.currentId = newId;}
, нет никакой возможности, что scope.currentId
будет обновляться, если директива не загрузится снова.
В этом случае вы можете сделать две вещи:
scope.currentId
и использовать scope.controller
непосредственно для currentId.controller.currentId
в директиве и установите новое значение scope.currentId
.scope.$watch('controller.currentId', function(newValue, oldValue) {
scope.currentId = newValue;
})
См. Этот Plunker.
Вы можете использовать $ watch в своей директиве
scope.$watch('trigerVariable', function(newValue, oldValue) {
//change your variable
}, true);
Когда вы изменяете trigerVariable в контроллере, он управляет этим директивным кодом.