2

阅读AngularJS :$observe 和 $watch 方法之间的区别,以及实现ng-href/ng-src

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-href并且ng-src两者都会产生字符串属性,因此attr.$observe在这里使用 interpolate 更安全且更容易。

任何想法?

4

1 回答 1

1

我认为范围不是你想的那样。

scope指令中的选项是false默认的,这意味着我们得到父作用域,它可以是任何东西,真的。

如果我们要观看element's attribute change,我们必须观看element's attribute "ng-blah"。范围根本不相关。

如果我们要使用scope.watch,我们可能甚至不会有一个以该属性命名的属性,并且什么都不会起作用。

于 2013-05-23T16:26:49.873 回答