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

4

1 回答 1

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在观察和解析它之前,但似乎是一个非常复杂的用例。

于 2013-09-17T22:20:00.127 回答