【问题标题】:Is 'IsolateScope' in Angularjs using $watch by default?Angularjs 中的“IsolateScope”是否默认使用 $watch?
【发布时间】:2025-12-27 20:10:06
【问题描述】:

我不明白为什么或为什么不使用 angularjs 隔离作用域或不使用 $watch?

例如:

app.directive('fooDirective', function () {
    return {
        scope: {
            readonly: '=' or '@' or '&'
        },
        link: function (scope, element, attrs) {
           // should I use $watch here or not ?
           scope.$watch('readonly', function () {
               // do I require to do so???
           });
        }
    };
});

【问题讨论】:

  • 这取决于你想做什么。
  • 这有关系吗?我想知道它是否针对该属性发布?我的意思是,如果在范围隔离之后我会有两个或一个 $watches?
  • 通过使用= 激活数据绑定,而@ 是只读的,最好用于字符串
  • 在你的情况下,你有一个 readonly 的观察者 - 你创建的那个 - 和一个隐含的观察者 readonly 绑定的任何表达式。
  • 为什么隐含 $watch 我可以禁用它吗?

标签: angularjs angularjs-directive isolate-scope


【解决方案1】:

如果你有这样的 HTML

<div foo-directive readonly="question.readonly">

会发生以下情况:指令中的scope.readonly 获得question.readonly 的值(来自隔离范围之外)。每当question.readonly 的值发生变化时,scope.readonly 的值也会相应变化。你无事可做。

但是,如果您想在 scope.readonly 更改时做一些额外的事情,例如在元素不再是只读时更改它的颜色,您需要自己的观察者 (scope.$watch)。

【讨论】:

    【解决方案2】:

    隔离作用域和$watch 不一样。使用像

    这样的独立作用域
    scope: {
        myAttr: '='
    }
    

    告诉$compile 绑定到my-attr="" 属性。这意味着如果您更改 directive 中的值,它也会在父作用域中更新。

    另一方面,如果值发生变化,使用$watch 会触发一个函数。

    【讨论】: