2016-05-03 13 views
1

私はそれに2つのオブジェクトを持つVMがあります。Angularjs:ウォッチオブジェクトと元のオブジェクトと比較

vm.obj = { 
    intObj1: { 
     title: 'title1' 
    }, 
    intObj2: { 
     name: 'name1' 
    } 
} 

vm.objがビューにバインドされている(私は構文としてコントローラを使用しています)

私はので、私はlodashを使用してモデルをクローン化された元のデータを持つようにしたい:

var originalModelState = _.cloneDeep(vm.obj); 

私は元の状態に比べてモデルの変化を見ています

$scope.$watch('vm.obj', function(newValue, oldValue){ 
     if (newValue !== originalModelState){ 

     } 
    }, true); 

悲しいことに、newValue !== originalModelStateは常に異なっており、参照が異なるため予期されています。私はとoldValueを比較しようとしましたが、例えばユーザがvm.obj.intObj1.title = 'new title'のようなプロパティを変更して、元の値に戻すと問題が発生します。 `vm.obj.intObj1.title = 'title1' VMが検出できません。元の値と同じです。これどうやってするの ?

答えて

2

あなたは、文字列などのオブジェクトを比較

var originalModelState = JSON.stringify(vm.obj); 

...

if (JSON.stringify(newValue) != originalModelState){ 
} 

を考えがありますあなたは何を探すべきか分からない場合は特に、私見違いを見つけるために非常に効果的かつ簡単な方法です。

+1

感謝を。これはトリックを行います。 – MDB

0

あなたが聞きたいことを正しく理解していれば、わかりません。ウォッチャーコールバックは、オブジェクト内の何かが変更された場合にのみ実行されます。 「真実」は深い腕時計を演じます。

あなただけを知りたい場合は、深いあなたのオブジェクトの値が同じ位置にoriginial値に等しい場合、あなたはウォッチャーにチェックすることができ:

$scope.$watch('vm.obj', function(newValue){ 
    if (originalModelState.intObj1.title === newValue.intObj1.title) { 
    // do something 
    } 
}, true); 
+0

これは、最後のオブジェクト状態からの変化のみを検出し、元のオブジェクトからの変化は検出しません – Nickolaus

関連する問題