2016-04-25 3 views
1

Контроллер моей директивы не обновляется с областью действия, которая была установлена ​​с помощью двусторонней привязки '='.Область действия директивы не обновляется в контроллере

Вот моя директива:

.directive('navigation', function() { 
    return { 
     restrict: 'E', 
     scope: { 
     selection: '=?selectedItem', 
     goforward: '&onForward' 
     }, 
     controller: function() { 
     var vm = this; 
     vm.hideForward = !vm.selection 
     }, 
     controllerAs: 'vm', 
     bindToController: true, 
     template: '<button ng-hide="vm.hideForward" ng-click="vm.goforward()">Continue</button>' 
    }; 
    }); 

Вот мой HTML файл, в котором я использую директиву:

<div class='product' ng-click='ctrl.selectedItem = true'>item</div> 
<navigation on-forward="ctrl.goForward()" selected-item='ctrl.selectedItem'></navigation> 

примечание: в ctrl.goForward() работает просто отлично.

vm.selectedItem в контроллере html установлен только на true после нажатия на кнопку div продукта.

Я ожидал, что ctrl.selectedItem перейдет в контроллер моей директивы и изменит значение vm.hideForward, за исключением того, что этого не происходит.

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

Если я помещаю <div>{{vm.selectedItem}}</div> внутри мой шаблон директивы, который правильно печатает в зависимости от того, как изменяется значение значения ctrl.selectedItem. Моя проблема заключается в том, что контроллер контролера также изменится.

Как я устанавливаю эту привязку сфера неправомерно? Я использую угловой 1.5.3

+0

Обычно это не но я столкнулся с ним несколько раз. Использование ng-hide иногда не работает должным образом. Попробуйте использовать ng-if вместо этого в шаблоне вашей директивы –

+0

ctrl.selectedItem - это переменная от текущего контроллера. как атрибут, вам необходимо передать его как '{{ctrl.selectedItem}} " –

ответ

0

Вам не нужны двойные скобки для связывания функции нг щелкни, используйте ng-click="vm.goforward()"

Передайте функцию директивы, как on-forward="ctrl.goForward", если вы используете скобку вы будете Проходя мимо результат вызова функции.

Также для, ng-click='ctrl.selectedItem === true' вы должны использовать ng-click='ctrl.selectedItem = true', чтобы установить значение, так как === является оператором сравнения.

+0

Я исправил проблему {{}} и проблему ===. Но я верю, что мне нужно передать вызов функции, а не только сама функция. Я не совсем уверен, почему, потому что, как вы полагаете, передача функции имеет смысл, но именно так это делается в [документации угла] (https://docs.angularjs.org/guide/directive) и в [ egghead tutorials] (https://egghead.io/lessons/angularjs-isolate-scope-expression-binding) – stecd

+0

, если вы передадите сообщение, вы должны называть его в своей директиве. Если вы хотите сделать так, как это делается в ng-click, вам нужно вычислять выражение каждый раз, когда вам нужно. – Walfrat

+0

Похоже, вы правы в том, что передаете такую ​​функцию, мою ошибку. – MTietze

0

ctrl.selectedItem представляется переменной от текущего контроллера. Таким образом, при прохождении его в качестве атрибута, вы должны передать его как «{{ctrl.selectedItem}}»

Попробуйте использовать:.

**<navigation on-forward="ctrl.goForward()" selected-item='{{ctrl.selectedItem}}'></navigation>** 
0

Попробуйте

.directive('navigation', function() { 
    return { 
     restrict: 'E', 
     scope: { 
     selection: '=selectedItem', 
     goforward: '&onForward' 
     }, 
     controller: function(scope) { 
     var vm = this; 
     vm.hideForward = !scope.selection 
     }, 
     controllerAs: 'vm', 
     bindToController: true, 
     template: '<button ng-hide="vm.hideForward" ng-click="vm.goforward()">Continue</button>' 
    }; 
    });