【问题标题】:Assigning a scope to another scope Angujarjs将范围分配给另一个范围Angularjs
【发布时间】:2016-01-22 10:07:43
【问题描述】:

我不知道为什么当我像这样将 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改变了topicsQuery.should也会改变,如果topicsQuery.should改变applyOrFilters也会改变。

但如果我这样说:

$scope.topicsQuery.should = [];

没有任何变化。

.splice 会改变对象的属性吗?

【问题讨论】:

    标签: angularjs scope angularjs-scope


    【解决方案1】:

    原答案

    来自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;
    

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

    $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);
    

    【讨论】:

    • 谢谢你,能否请您查看我的最新更新,我将不胜感激
    猜你喜欢
    • 2014-01-05
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多