Я использую angular.copy
для клонирования объекта, чтобы я мог обнаружить изменения для объекта следующим образом:
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
так как строки равны. Не так ли?
Использовать угловые равные
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>
Я думаю, вы должны использовать угловые.равнения вместо использования ссылочного равенства:
https://docs.angularjs.org/api/ng/function/angular.equals
Вместо:
$scope.hasChanges = !($scope.obj == $scope.objCopy);
замените его:
$scope.hasChanges = !angular.equals($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>
str
, не будет ли этого достаточно? Вы также можете JSON.stringify (obj) и проверить на равенство