2015-12-01 2 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

Использовать угловые.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 = !($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>

+0

Также -> JSON.stringify ($ scope.obj) === JSON.stringify ($ scope.objCopy), хотя угловое значение является лучшим и безопасным вариантом. – FrailWords

+0

Конечно, это сработает. Я предпочитаю angular.equals, потому что он более явный, и нам не нужно разбирать 2 объекта в виде строки, чтобы сделать простое сравнение. –

+0

Прямо на. Я просто положил его туда, чтобы любой, кто использует «равных», по-прежнему ищет преимущества этого метода: – FrailWords

Смежные вопросы