2017-11-23 3 views
1

私はautorunreactionの説明を何度も読んでいますが、1つの観測値の変化を検出したときにどのパターンを使用するかはまだ分かりません。変更を検出して他の観測値を変更するために使用するMobXパターンはどれですか?

Iは、以下に示したアドレスオブジェクトを持っています。国が変わるたびに、他のすべてのフィールドをリセット/再初期化したい。これを行う1つの方法は、Addressクラス内に@action setCountry() {...}を持ち、他の観測値を設定することです。しかし、私のUIは一般的な手法を使用してストア属性を更新するため、つまり贅沢はありません。つまり_.set(entity, attr, value)です。ですから、私はautorunのようなものを使って変化を検出し、残りの観測値を更新したいと思います。これを行う正しい方法は何ですか?

class Address { 
    @observable name; 
    @observable line1; 
    @observable line2; 
    @observable city; 
    @observable state; 
    @observable zip; 
    @observable country; 
    ... 
} 
+0

まさにあなたが他の観測を更新したいと思いますか?私にとっては、これは[** computed **](https://mobx.js.org/refguide/computed-decorator.html)の優れたユースケースのように聞こえるので、派生した値は自動的に更新されます。 – Tholle

+1

他の値は導出されないので、この場合は計算が適切ではありません。 1つのユースケースはこれです:選ばれた国によっては、他のオブザーバブルをその国の本社にデフォルト設定したいのですが、それは時間の90%が望ましいかもしれません。しかし、ユーザーは自由にアドレスを他のものに変更することができます。これが私が国への変化を見て、適切に反応したいと思うところです。 – Naresh

答えて

1

observeをご利用の場合のために働くだろうようですね。

例(JSBin

class Address { 
    @observable name = ''; 
    @observable line1 = ''; 
    @observable line2 = ''; 
    @observable city = ''; 
    @observable state = ''; 
    @observable zip = ''; 
    @observable country = ''; 
} 

const address = new Address(); 

observe(address, change => { 
    if (change.name === 'country' && change.newValue === 'Sweden') { 
    address.city = 'Stockholm'; 
    } 
}); 

autorun(() => { 
    console.log(toJS(address)); 
}); 

setTimeout(() => { 
    address.country = 'Sweden'; 
}, 2000); 
+1

ありがとう、@ Tホール。これは非常に便利です。好奇心のために、 'observe()'を 'Address'クラスの中に入れてディスポーザを捕捉することは可能でしょうか?私は本当に 'Address'インスタンスがこのロジックをカプセル化したいと思っています。 – Naresh

+1

@Naresh問題ありません!リスナを破棄したいときは、[**何か**このようにすることができます(http://jsbin.com/podikusolu/1/edit?js,console)、カスタム 'destroy'メソッドを呼び出すことができます。 – Tholle

+0

それは完璧です、@ Tホール!あなたのご親切に感謝します。 – Naresh

関連する問題