从外部控制角度指令

时间:2013-09-17 22:09:24

标签: angularjs coffeescript angularjs-directive

我正在尝试从主控制器更改指令。

这是指令代码

# 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

1 个答案:

答案 0 :(得分:0)

请注意,attrs.$observeattrs.$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,但似乎是一个非常复杂的用例。