如何在指令的attrs中观看财产

时间:2013-12-05 14:53:45

标签: angularjs

我的控制器有一个不时变化的计数器 该计数器与指令的属性相关联,并在该指令的链接函数内读取。

每次attr值改变时,如何让指令运行一个函数?

感谢。

5 个答案:

答案 0 :(得分:39)

我正在使用这种方法:

.directive('mydirective',
 [function (){
    return {
      ...
      scope: {
        id: '@',
      },
      controller: function ($scope, $element, $attrs) {
         $attrs.$observe('id', function(passedId) {
           /// do what is needed with passedId
         });
    ...

使用的指令和id传递如下:

<div mydirective id="{{someprop.id}}" />

答案 1 :(得分:25)

在相应的link函数中:(假设您的属性名为counter且您的范围变量为:scope

scope.$watch(attrs.counter, function (newTime) {
                    //do something with the new Time
});

其他方式,肯定是更有效的方式:

内插属性

在你的指令中,设置scope属性如下(它将被隔离):

scope: { counter: '@'}

只要调用counter函数,就会自动观察link提供当前值。

'@'优于'=',因为您认为您没有将指针设置为指令中的新值,这意味着您只需阅读它。实际上,=对于双向数据绑定更有用,但您可能不需要它。

答案 2 :(得分:11)

使用attrs.$observe(key, fn)。有关详情,请访问$compile.directive.Attributes

attrs.$observe('counter',function(counter){

});

相关答案:https://stackoverflow.com/a/14907826/2874153

  

$ observe()是Attributes对象的一个​​方法,因此它可以   仅用于观察/观察DOM属性的值更改。它   仅在指令内使用/调用。需要时使用$ observe   观察/观察包含插值的DOM属性(即   {{}}的)。例如,attr1 =“Name:{{name}}”,然后在一个指令中:   attrs。$ observe('attr1',...)。 (如果你尝试范围。$ watch(attrs.attr1,   ...)它将无法工作,因为{{}} s - 你将得到未定义。)使用   $注意其他一切。

答案 3 :(得分:3)

如果可以,请将指令更改为隔离范围并使用=定义。这将为scope属性设置双向绑定:

app.directive('myDirective', function() {

    return {
        scope: { counter: '=' }
    }
});

答案 4 :(得分:3)

我必须自己实施并找到解决方案!不幸的是,当我尝试。$ watch时,错误只是在控制台上喷出。所以我使用了$ observe。

这是我的解决方案:

angular.module('app').directive('aDate', [
    function() {
        return {
            template: '<span>{{date}}</span>',
            restrict: 'E',
            replace: true,
            link: function(scope, element, attrs) {
                attrs.$observe('date', function (val) {
                    var d = new Date(val);
                    element.text(d);
                });
            }
        };
    }
]);

当元素的日期属性发生变化时,上面的代码会更改作用域的日期!

干杯!