Как обнаружить изменения в скопированном объекте в Angular?

0

Я использую 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 так как строки равны. Не так ли?

  • 0
    если вы просто проверите str , не будет ли этого достаточно? Вы также можете JSON.stringify (obj) и проверить на равенство
  • 0
    Используйте angular.equals (obj1, obj2) вместо obj1 == obj2.
Теги:

2 ответа

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

Я думаю, вы должны использовать угловые.равнения вместо использования ссылочного равенства:

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), хотя angular.equals является лучшим и более безопасным вариантом.
  • 0
    Конечно, это будет работать. Я предпочитаю angular.equals, потому что он более явный, и нам не нужно анализировать 2 объекта как строку для простого сравнения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню