2015-12-01 26 views
0

我使用angular.copy克隆對象,這樣我可以發現變化的對象,像這樣:如何檢測Angular中複製對象的更改?

var app = angular.module('MyApp', []); 
 
app.controller('MyCtrl', function ($scope) { 
 
    $scope.obj = { 
 
    id: 1, 
 
    str: "Hello World" 
 
    }; 
 
    $scope.init = function() { 
 
    $scope.objCopy = angular.copy($scope.obj); 
 
    } 
 
    $scope.hasChanges = false; 
 
    $scope.change = function() { 
 
    $scope.hasChanges = !($scope.obj == $scope.objCopy); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="MyApp"> 
 
    <div ng-controller="MyCtrl" ng-init="init()"> 
 
     <input type="text" ng-model="objCopy.str" ng-change="change()" /> 
 
     <pre>obj = {{ obj }}</pre> 
 
     <pre>objCopy = {{ objCopy }}</pre> 
 
     <pre>hasChanges? {{ hasChanges }}</pre> 
 
    </div> 
 
</div>

的問題是,雖然當我添加字符的文本字符串如果我將該字符串編輯回其原始文本,hasChanges變量仍然顯示爲true,則檢測到更改。由於字符串相同,我希望它變成false。他們不是?

+0

如果你只是檢查'str'不會是suffient?你也可以JSON.stringify(obj)並檢查是否相等 – koox00

+0

使用angular.equals(obj1,obj2)而不是obj1 == obj2。 –

回答

2

使用角等於

var app = angular.module('MyApp', []); 
 
app.controller('MyCtrl', function ($scope) { 
 
    $scope.obj = { 
 
    id: 1, 
 
    str: "Hello World" 
 
    }; 
 
    $scope.init = function() { 
 
    $scope.objCopy = angular.copy($scope.obj); 
 
    } 
 
    $scope.hasChanges = false; 
 
    $scope.change = function() { 
 
    $scope.hasChanges = !angular.equals($scope.obj, $scope.objCopy); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="MyApp"> 
 
    <div ng-controller="MyCtrl" ng-init="init()"> 
 
     <input type="text" ng-model="objCopy.str" ng-change="change()" /> 
 
     <pre>obj = {{ obj }}</pre> 
 
     <pre>objCopy = {{ objCopy }}</pre> 
 
     <pre>hasChanges? {{ hasChanges }}</pre> 
 
    </div> 
 
</div>

1

我認爲你應該使用angular.equals而不是使用一個參考平等:

https://docs.angularjs.org/api/ng/function/angular.equals

相反的:

$scope.hasChanges = !angular.equals($scope.obj, $scope.objCopy); 

$scope.hasChanges = !($scope.obj == $scope.objCopy); 

代之以

請嘗試以下代碼:

var app = angular.module('MyApp', []); 
 
app.controller('MyCtrl', function ($scope) { 
 
    $scope.obj = { 
 
    id: 1, 
 
    str: "Hello World" 
 
    }; 
 
    $scope.init = function() { 
 
    $scope.objCopy = angular.copy($scope.obj); 
 
    } 
 
    $scope.hasChanges = false; 
 
    $scope.change = function() { 
 
    $scope.hasChanges = !angular.equals($scope.obj, $scope.objCopy); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="MyApp"> 
 
    <div ng-controller="MyCtrl" ng-init="init()"> 
 
     <input type="text" ng-model="objCopy.str" ng-change="change()" /> 
 
     <pre>obj = {{ obj }}</pre> 
 
     <pre>objCopy = {{ objCopy }}</pre> 
 
     <pre>hasChanges? {{ hasChanges }}</pre> 
 
    </div> 
 
</div>

+0

也是 - > JSON.stringify($ scope.obj)=== JSON.stringify($ scope.objCopy),儘管angular.equals是一個更好和更安全的選項。 – FrailWords

+0

當然,這將工作。我更喜歡angular.equals,因爲它更加明確,並且我們不必將2個對象解析爲字符串,以便進行簡單的比較。 –

+0

對。我只是把它放在那裏,以便任何使用'等於'的人至少在這個方法上查找它的優點:) – FrailWords