【问题标题】:Control angular directive from outside从外部控制角度指令
【发布时间】:2013-09-18 07:00:46
【问题描述】:

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

这是指令代码

# 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

【问题讨论】:

    标签: angularjs coffeescript angularjs-directive


    【解决方案1】:

    小心,attrs.$observeattrs.$set 用于操作给定属性的,而不是内容

    如果您关心内容,您应该在属性的上使用$watch$parse

    例如

    <input ng-model="foo" />
    

    $scope.foo = "bar";
    

    属性'ngModel'"foo",其内容为"bar"

    如果您不希望属性的 value 发生变化,即不对其进行插值,以便读取/写入模型的 content它代表你可以做到

    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它,但这似乎是一个非常复杂的用例。

    【讨论】:

    • scope.$watch 版本中如何更改指令中的值
    • 我还将assign 包装成$apply 以使其更清晰。
    • 它来自哪里$parse
    • 这是一个 Angular 服务。您可以通过通常的注入从您的指令中获取它。文档在这里docs.angularjs.org/api/ng.$parse
    猜你喜欢
    • 2021-08-19
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多