Изменить значение директивы с контроллера

0

У меня есть директива, которая используется в трех разных областях в контроллере. Теперь я хочу вызвать функцию в одной директиве, она изменит значение в других директивах.

// 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 не изменяется.

Как преодолеть эту проблему?

  • 0
    Пожалуйста, создайте поршень.
  • 0
    используйте scope. $ apply (); внизу ссылки: функция
Показать ещё 1 комментарий
Теги:

2 ответа

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 изменяется для директивы obj2 через function(newId){$scope.obj2.currentId = newId;}, нет никакой возможности, что scope.currentId будет обновляться, если директива не загрузится снова.

В этом случае вы можете сделать две вещи:

  1. Вы можете удалить scope.currentId и использовать scope.controller непосредственно для currentId.
  2. Вы можете смотреть controller.currentId в директиве и установите новое значение scope.currentId.
scope.$watch('controller.currentId', function(newValue, oldValue) {
    scope.currentId = newValue;
})

См. Этот Plunker.

  • 0
    Оно работает. Спасибо!
0

Вы можете использовать $ watch в своей директиве

scope.$watch('trigerVariable', function(newValue, oldValue) {
    //change your variable
}, true);

Когда вы изменяете trigerVariable в контроллере, он управляет этим директивным кодом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню