2016-12-30 16 views
0

私はかなり大きいですが、ボタンでリセットしようとしましたが、期待通りに動作しませんでした。リセット角度1.5ビューモデル

は、私は、各フェイルドを編集するNG-モデルでvm.dataを使用しています。ここ

function someCtrl() { 
    var temp; 
    var vm = this; 
    someService.then(function (res) { 
     vm.data = res; 
     temp = res; 
    }); 

    vm.reset = function() { 
     vm.data = temp; //so that vm will reset to res; 
    } 
} 

以下の私のコードを参照してください。しかし、ng-modelでvm.dataを編集するとtempも更新されます。いくつかの可変範囲の参照が起こっていると思います。したがって、vm.resetがvm.dataと呼ばれ、tempが同じ場合、リセットは起こっていません。

この可変範囲の参照を削除する方法を提案してください。 angular.copy()ディープコピーとして、新しいオブジェクトを作成し、一方

答えて

1

、オブジェクトは参照によって渡されます。 サービスコールバック内で、vm.dataとtempの両方に同じ応答オブジェクトを割り当てます。このように、vm.dataを変更している間は、両方とも同じメモリ位置を指しているため、tempも変更されます。

別のインスタンス(ディープクローンresオブジェクト)をvm.dataとtempに割り当てます。

someService.then(function (res) { 
    vm.data = angular.copy(res); 
    temp = res; // no need to deep clone this one. temp can point to the res obj 
}); 

そして、うーん意味をなさない@HamletHakobyanこの

vm.reset = function() { 
    vm.data = angular.copy(temp); // assign "backup" value to vm.data 
} 
+0

私の答えとの違いは何ですか – Sajeetharan

+0

その違いはありません、私たちはちょうど同じ時間にそれらを書きました – Sasha89

1

angular.copy使用代わりに割り当て、=基準を表します。あなたのコードがなる

angular.copy(res, temp); 

、JavaScriptでは

someService.then(function (res) { 
     vm.data = res; 
     angular.copy(res, temp); 
}); 
+0

にリセット機能を変更、あなたはvm.reset機能の奥深くクローンを行ういけない場合は、両方の、最初の実行後、 – Sajeetharan

+0

を行って:このようにvm.dataとtempは再び同じオブジェクトになります。だからこれは一度だけ動作します – Sasha89

+0

はいSasha89が正しいです。最初の割り当ての後、vm.resetに深いクローンがないときは動作を停止しました。 –

関連する問題