【问题标题】:Update angularJs directive scope variable on change parent scope在更改父范围时更新 angularJs 指令范围变量
【发布时间】:2015-09-09 13:39:09
【问题描述】:

我正在 angularJS 中创建一个将替换元素的指令。我在父作用域中有一个绑定到元素的变量。

我想在更改父范围变量值时更新指令范围变量。

元素如下所示

<my-element attr-xyz="scope_variable"></myelement>

当我编写如下指令时,它会在范围变量更新时给出更新的值

.directive('myElement', function(){
    return function(scope, elem, attr){
        scope.$watch(attr.attrXyz, function(value) {
            console.log(value);
        });
    }
});

但是当我编写如下相同的代码时,它会给出未定义的值

return {
    scope: {attrXyz: '@'},
    restrict: 'E',
    replace: true,
    link: function(scope, element, attr, controller){
        scope.$watch(attr.attrXyz, function(value){
            console.log('value = '+value);
        });
    }
}

【问题讨论】:

  • 更好的方法是将link: function替换为controller:function

标签: javascript angularjs mean


【解决方案1】:

两种方式都可以。 (指令 1-2)http://plnkr.co/edit/2kJT1mkaORsS8RUOyZ0N?p=preview

但是,如果您引入孤立的范围 - 第二种方式不起作用。 (指令 3)

然后你可以使用$observe(指令4)

  attr.$observe('attrXyz', function(value){
      console.log('4: '+ value);
  });

或者你可以在范围内定义它并使用watch。

【讨论】:

  • 我已在范围内将其定义为 scope:{attrXyz:'@'} 并使用了手表,但它不起作用。我已将其替换为 attr.$observe('attrXyz',function(value){});现在它对我来说工作正常。
  • 添加到 plunk 指令 5,范围为:{attrXyz:'@'} 并观看
  • 好了,基本上只是attr.attrXyz到attrXyz的变化。感谢日志。
【解决方案2】:

我建议你只使用ng-attr

<my-element ng-attr-xyz="scope_variable"></myelement>

仅当您确实需要在该值更改时触发指令中的函数/验证时才使用$observe$watch,否则您只是为此添加侦听器并且更易于维护以使用模板中的属性。

【讨论】:

  • ng-attr 被弃用了吗?我在文档中找不到它
  • 在 1.3.20 版本之后似乎已被弃用。 Here 是文档。
  • 该功能仍在工作,但在 Angular 1.5 中似乎不再需要阅读 migration docs。如果我错了,请纠正我
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2017-09-28
  • 2016-02-06
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多