2013-09-17 8 views
0

Я пытаюсь внести изменения в директиву от моего основного контроллера.Управляющая угловая директива снаружи

это код директивы

# directive.coffee 
application.directive 'btnState', -> 
    { 
     restrict: 'A' 
     link: (scope, el, attrs) -> 
      attrs.$observe 'ngModel', (newVal) -> 
       switch newVal 
        when 'loading' 
         # do something 
        when 'reset' 
         # do other thing 
      el.click (event) -> 
       attrs.$set 'ngModel', 'loading' 
      return 
    } 

сейчас в моем шаблоне

<button id="#do-btn" ng-click="doSometing()" ng-model="ns.btn_state" btn-state>Do it</button> 
<button id="#cancel-btn" ng-click="ns.btn_state = 'reset'">Cancel</button> 

Когда я нажимаю на #do-btn кнопку работает оштрафовать $observe цепляет изменение, но когда я пытаюсь изменить ns.btn_state снаружи никогда не попадал

Как я могу это решить?

Я использую угловой 1.0.7

ответ

0

Будьте осторожны, attrs.$observe и attrs.$set используются для управления значением данного атрибута, а не содержание .

Если вы заботитесь о содержании вы должны использовать $watch и $parse над значением ваших атрибутов.

Например, в

<input ng-model="foo" /> 

с

$scope.foo = "bar"; 

значение атрибута 'ngModel' является "foo" и его содержание "bar".

В случае, если вы не ожидаете значение вашего атрибута изменить, т.е. не интерполированное, для того, чтобы читать/писать содержание модели он, представляющий вы можете просто сделать

var model = $parse(attrs.foo); 
var content = model(scope); // read 
scope.$apply(function() { 
    model.assign(scope, 'new content'); // write 
}); 

И реагируют на изменения

scope.$watch(attrs.foo, function (new, old) { ... }); 

Если атрибут интерполированное, то вы должны $observe перед просмотром и анализом, но, похоже, это очень сложный случай использования.

+0

в версии 'scope. $ Watch', как я могу изменить значение внутри директивы – rkmax

+0

Я только что отредактировал свой ответ. Надеюсь, это поможет. – ovmjm

+0

Я также завернул 'assign' в' $ apply', чтобы сделать его более понятным. – ovmjm

Смежные вопросы