2

次の問題: たとえば、次のようなオブジェクトがあるとします。

$scope.Something = { 'a' : { object... }, 'b' : { another object... } }

この Something-object も、次のようにビューにレンダリングされます。

<div ng-repeat="s in Something">{{ Something[s].someProperty }}</div>

ユーザーはSomething.aを編集したいと考えています。このために、私たちは彼に形を見せます。フォームが表示される前に、現在のSomething.aをコピーとして保存します。

$scope.copyForUndo= angular.copy($scope.Something.a);

ここで、ユーザーが [キャンセル] をクリックすると、次のようになります。

$scope.Something.a = angular.copy($scope.copyForUndo);

しかし、それ以来、協会は消えているようです。ユーザーが現在、Something.a にどのような変更を加えても、ビューは更新されません。

なんで?

オブジェクトの等価性が何であるかは知っています (たとえば、{ object1: true } != {object1 : true} ですが、それでも機能しない理由を理解できません。

4

5 に答える 5

2

コピー元が ng-repeat 反復項目の場合は、使用する必要があります

angular.copy($scope.copyForUndo, $scopy.sourceItem)

代わりに

$scope.sourceItem = angular.copy($scope.copyForUndo)

$$hashkeyそれ以外の場合、反復項目の が誤った copy ステートメントによって消去されたため、データバインディング DOM は追跡されません。

https://github.com/angular/angular.js/blob/g3_v1_2/src/Angular.js#L777

于 2015-01-10T11:47:09.440 に答える
1

少し奇妙に思えますが、元の配列 $scope.Something を保存できれば、キャンセル時に再バインドできます。

 // saving original array to get the original copy of edited object
 var originalArrayCopy = angular.copy($scope.Something);
 ............
 // When user clicks cancel then simply filter the originalArray to get the original copy, here i am assuming there is a field in object which can uniquely identify it. 
// var originalObject = originalArrayCopy .filter(function(elm)
   {
       if(editedObject.Id == elm.Id)
              return elm;
   } );
 // once i get the original object , i can rebind it to the currentObject which is being edited.
于 2013-09-17T04:39:36.957 に答える
1

非破壊的なフォーム編集: http://egghead.io/lessons/angularjs-angular-copy-for-deep-copy

あらすじ:

  • ユーザーがクリックしたオブジェクトへのポインターを作成します
  • ユーザーが編集して保存を決定できるオブジェクトのコピーを作成する|キャンセルする
于 2013-10-14T16:45:50.887 に答える