Angularjs指令如何检测属性的变化

Angularjs directive how to detect changes in the attributes

我在我的项目中使用 jquery ui 和 angularjs。我有这样的指令。

app.directive('datepicker', function() {
    return {
         link: function (scope, element, attrs) {
          element.datepicker({
            altField: "#d" + attrs.fieldname + "_alt",
            altFormat: attrs.dateformat,
          });
        }
    };

我喜欢用。

<div fieldname="{{field.name}}" dateformat="{{field.dateformat}}" datepicker></div>

它工作正常。但是如果 attrs 发生变化,这些变化不会反映在日期选择器中。我想知道我是否可以使用这样的东西..

<div fielddata="field" datepicker></div>

并在指令中使用 scope{ data: "=fielddata"} 并在我的 link 函数中使用 scope.data.fieldname

而不是 attrs.fieldname

感谢任何帮助

你必须添加手表才能做你想做的事。像上面那样使用 scope: {} 确实会在后台添加监视,以将指令的隔离范围与外部数据同步。但是由于您使用的是 jQueryUI,因此您需要对每个更改执行自定义操作,因此只需自己添加手表即可。例如:

app.directive('datepicker', function() {
    return {
        link: function (scope, element, attrs) {
            element.datepicker({
                altField: "#d" + attrs.fieldname + "_alt",
                altFormat: attrs.dateformat,
            });

            attrs.$observe('dateformat', function(newval) {
                element.datepicker('option', 'altFormat', newval);
            });

            // and so on for every attribute
        }
    };
});

attrs.$observe 将适用于插值属性,即具有 {{...}} 表达式的属性。如果您想将复杂的对象传递给您的指令,您可能需要使用 $parsescope.$watch