Angularjs 为什么在替换阵列时,与服务阵列的作用域绑定不会更新

Angularjs 为什么在替换阵列时,与服务阵列的作用域绑定不会更新,angularjs,data-binding,angularjs-scope,Angularjs,Data Binding,Angularjs Scope,我有一个作用域绑定到存储在服务中的数组。 当数组更改时,作用域会注意到更改并更新我的模板中的值 但是,当数组被另一个数组替换时,作用域似乎无法识别更改,并且不会更新列表 我知道这是angularjs的一种常见行为,可能是有意这样做的,但我不明白为什么。 在我的理解中,只要绑定引用发生更改,scope变量就应该更新 Is$scope.myVar=anyOtherVar不等同于$scope.$watch('anyOtherVar',函数(..){//update myVar}) 看我的小提琴演示这个

我有一个作用域绑定到存储在服务中的数组。 当数组更改时,作用域会注意到更改并更新我的模板中的值

但是,当数组被另一个数组替换时,作用域似乎无法识别更改,并且不会更新列表

我知道这是angularjs的一种常见行为,可能是有意这样做的,但我不明白为什么。 在我的理解中,只要绑定引用发生更改,scope变量就应该更新

Is
$scope.myVar=anyOtherVar不等同于
$scope.$watch('anyOtherVar',函数(..){//update myVar})

看我的小提琴演示这个问题。

以及相应的模板:

<div ng-controller="MyCtrl">
  <button ng-click="newElement()">
    newElement()
  </button>
  <button ng-click="replaceWholeArray()">
    replaceWholeArray()
  </button>
  <ul>
    <li ng-repeat="el in elements">{{el.name}}</li>
  </ul>
</div>

新元素()
replaceWholeArray()
  • {{el.name}

您正在更新变量,但这不会更新使用原始变量进行的任何其他变量分配

因此,
myService.anyArray

简单例子

var a = 1;
var b = a;
a = 2;
alert(b);// is still 1 due to value of `a` when it was assigned
相反,只需更新factory对象属性,但要做到这一点,需要首先存储对返回对象的引用

myApp.factory('myService', function() {
  var anyArray = [...];

  var anyOtherArray = [...];

  var factoryObject = {
    anyArray: anyArray,
    newElement: function() {
      anyArray.push({"name": "bob"});
    },
    replaceWholeArray: function() {
      // change this part
      //anyArray = anyOtherArray;
      // To:
      factoryObject.anyArray = anyOtherArray;
    }
  }

  return factoryObject
});

问题本身应包含所有相关代码。问题必须是独立的。演示仅用于支持问题中的内容OK,这是有道理的。因此,一般来说,
$scope.any=anyOther
绑定不会为
anyOther
注册观察程序?它与观察程序无关,与中断对返回服务中原始数组集的引用有关。参见我添加的简单示例,
watcher
是指angularjs如何处理双向绑定,以及何时检查绑定引用的更改。但我似乎必须深入挖掘主题性是javascript的一个基本问题。我不能看一个坏掉的参考
myApp.factory('myService', function() {
  var anyArray = [...];

  var anyOtherArray = [...];

  var factoryObject = {
    anyArray: anyArray,
    newElement: function() {
      anyArray.push({"name": "bob"});
    },
    replaceWholeArray: function() {
      // change this part
      //anyArray = anyOtherArray;
      // To:
      factoryObject.anyArray = anyOtherArray;
    }
  }

  return factoryObject
});