AngularJS 如何在其指令中实现双向 `'='` 绑定

How does AngularJS implement two-way `'='` binding in its directives

AngularJS如何在其指令中通过引用进行绑定?

有时,当我在 directive 中使用 '=' 通过引用传递变量,并更新 parent controller 中的引用变量时,它不会立即更新,但会更新在制作 $scope.$digest().

之后

我认为 angular 不像 JS 绑定那样进行引用绑定,但是当 scope digest 它只是更新其引用的变量。

不知道我的理论对不对

你怎么看?

AngularJS$compile service通过添加watcher实现双向'='绑定:

var parentValueWatch = function parentValueWatch(parentValue) {
  if (!compare(parentValue, destination[scopeName])) {
    // we are out of sync and need to copy
    if (!compare(parentValue, lastValue)) {
      // parent changed and it has precedence
      destination[scopeName] = parentValue;
    } else {
      // if the parent can be assigned then do so
      parentSet(scope, parentValue = destination[scopeName]);
    }
  }
  lastValue = parentValue;
  return lastValue;
};

parentValueWatch.$stateful = true;
if (definition.collection) {
  removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);
} else {
  removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);
}
removeWatchCollection.push(removeWatch);

— GitHib AngularJS compile.js Source Code

观察者检查父作用域 属性 是否与隔离作用域 属性 不同步并根据需要进行更新。这意味着隔离范围仅在摘要周期后更新。