AngularJS:为什么使用attr。$ observe而不是scope来实现ng-href / ng-src。$ watch?

时间:2013-05-23 14:29:49

标签: angularjs angularjs-directive

阅读了ng-href/ng-src的{​​{3}}和AngularJS : Difference between the $observe and $watch methods

link: function(scope, element, attr) {
  attr.$observe(normalized, function(value) {
    if (!value)
      return;

    attr.$set(attrName, value);
    // ...
  }
}

我想知道为什么使用ng-href/ng-src代替attr.$observe来实现scope.$watch。使用scope.$watch,它看起来像

link: function(scope, element, attr) {
  scope.$watch(attr[normalized], function(newValue) {
    // ...
  })
}

然后在视图中我们可以写<img ng-href="expressionFoo">而不是<img ng-href="{{ expressionFoo }}">

我可以理解的可能原因是

  1. attr.$observe使指令更像普通的DOM属性。在链接之后,我可以通过attr.$set('ngHref', ...)在另一个指令中影响该指令。
  2. 插值比表达式更高。使用interpolate更容易编写普通字符串和多个表达式。
  3. ng-hrefng-src都会产生字符串属性,因此在此使用插值安全且更容易attr.$observe
  4. 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为范围不是您的想法。

默认情况下,指令中的选项scopefalse,这意味着我们可以获得父范围,这可能是真的。

如果我们想要关注element's attribute change,我们必须关注element's attribute "ng-blah"。范围根本没有关系。

如果我们使用scope.watch,我们可能甚至没有一个以该属性命名的属性,并且没有任何方法可行。