将范围分配给另一个范围Angujarjs

时间:2016-01-22 10:07:44

标签: angularjs scope angularjs-scope

当我将1个范围分配给另一个范围时,我不知道为什么会这样:

$scope.test1 = "hello";
$scope.test1 = $scope.test2;

有时如果我改变$ scope.test2,$ scope.test1也会改变,有时候不会改变。 有时如果我改变$ scope.test1,$ scope.test2也会改变。

为什么会这样?也许我在承诺或类似的东西?

我不需要解决方案我只想要理论,angular.copy是解决方案。

这是我的代码:

$scope.topicsQuery.should = $scope.appliedOrFilters;
$scope.appliedOrFilters.splice(i, 1); 
$scope.topicsQuery.should.splice(filtersToDelete[i],1);

然后,如果appliedOrFilters改变了topic.should也会改变,如果topicsQuery.should改变,applyOrFilters也会改变。

但是,如果我这样说:

$scope.topicsQuery.should = [];

没有任何改变。

.splice是否会更改对象的属性?

1 个答案:

答案 0 :(得分:3)

原始答案

来自Javascript by reference vs. by value

  
      
  • Javascript总是按值传递,但是当变量引用时   对象(包括数组),"值"是对象的引用。

  •   
  • 更改变量的值永远不会更改基础   原始或对象,它只是将变量指向一个新的原语或   宾语。

  •   
  • 但是,更改a引用的对象的属性   变量确实会改变底层对象。
  •   

因此,如果您更改对象引用,则无法更新。

$scope.test1 = "hello";
$scope.test2 = $scope.test1;
$scope.test1 = "world";

console.log($scope.test2); //prints "hello"

但是如果你改变一个对象的属性,它将被更新:

$scope.test1 = {"title": "hello"};
$scope.test2 = $scope.test1;
$scope.test1.title = "world";

console.log($scope.test2.title); //prints "world"

-

更新问题

$scope.topicsQuery.should = $scope.appliedOrFilters;

将在2个变量上看到对数组.should.appliedOrFilters的所有修改。

$scope.appliedOrFilters.splice(i, 1);
$scope.topicsQuery.should.splice(filtersToDelete[i],1);

the documentation 所示,splice编辑数组本身,所以它很好。

$scope.topicsQuery.should = [];

在此创建一个新数组并将其分配给.should

所以.appliedOrFilters仍指向前一个数组,完全正常。

如果你想删除数组,你应该做

$scope.topicsQuery.should.splice(0, $scope.topicsQuery.should.length);