2016-10-11 13 views
2

observableが何らかの方法で変更されたときを検出することは可能ですか?mobx observableが変更されたときを検出

@observable myObject = [{id: 1, name: 'apples'}, {id: 2, name: 'banana' }] 

そして、後に、一部のユーザー入力で、値が変更します。例えば

は、あなたがこれを持っていると言います。どのようにすればこれを簡単に検出できますか?

グローバルな「保存」ボタンを追加したいが、最初の読み込み後にその観測値が変更された場合にのみクリック可能にする。

私の現在の解決策はtrue/falseを返すもう1つの可観測性のあるmyObjectChangedを追加することです。コンポーネントがmyObjectのデータを変更する場合は、myObjectChangedをtrueに変更する行も追加します。また、保存ボタンをクリックすると、保存され、観察対象をfalseに戻します。

この結果、多くの余分なコードが散りばめられます。それを行うためのより良い/クリーンな方法がありますか?

+1

あなたがcomputed' 'のいずれかを使用することができますように私は感じて、'観察'、' 'spy'、' 'autorun'のように、あなたの観測に必要な細かさのレベルに依存します。ここでは、 '計算された'とのフォームの汚れチェックの簡単な例があります。https://github.com/mobxjs/mobx/issues/164 – m0meni

答えて

2

あなたはこれを達成するためにautorunを使用することができます。

@observable myObject = [{id: 1, name: 'apples'}, {id: 2, name: 'banana' }] 
@observable state = { dirty: false } 

let firstAutorun = true; 
autorun(() => { 
    // `JSON.stringify` will touch all properties of `myObject` so 
    // they are automatically observed. 
    const json = JSON.stringify(myObject); 
    if (!firstAutorun) { 
    state.dirty = true; 
    } 
    firstAutorun = false; 
}); 
+0

これは本当にうまく動作します、ありがとう! 1つの小さなことですが、constはそれがfalseに変更することを許可しないので、firstAutorunはletにする必要があります。 – user3245789

+0

今、修正されました! –

0

myObjectというにプッシュするアクションを作成し、設定は

をmyObjectChanged
@action add(item) { 
    this.myObject.push(item); 
    this.myObjectChanged = true; 
} 
関連する問題