Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用哪种MobX模式来检测变化和改变其他观察值?_Javascript_Mobx - Fatal编程技术网

Javascript 使用哪种MobX模式来检测变化和改变其他观察值?

Javascript 使用哪种MobX模式来检测变化和改变其他观察值?,javascript,mobx,Javascript,Mobx,我多次阅读了和的描述,但当我检测到一个观察到的变化并且我想更新其他观察到的变化时,我仍然不清楚使用哪种模式 示例 我有一个地址对象,如下所示。每当国家/地区发生变化时,我希望重置/重新初始化所有其他字段。一种方法是在Address类中设置一个@action setCountry(){…},该类负责设置其他可观察对象。但是,我没有这种奢侈,因为我的UI使用通用技术来更新存储属性,即\uu.set(entity、attr、value)。因此,我想使用类似于autorun的方法来检测变化并更新其余的可

我多次阅读了和的描述,但当我检测到一个观察到的变化并且我想更新其他观察到的变化时,我仍然不清楚使用哪种模式

示例

我有一个地址对象,如下所示。每当国家/地区发生变化时,我希望重置/重新初始化所有其他字段。一种方法是在
Address
类中设置一个
@action setCountry(){…}
,该类负责设置其他可观察对象。但是,我没有这种奢侈,因为我的UI使用通用技术来更新存储属性,即
\uu.set(entity、attr、value)
。因此,我想使用类似于
autorun
的方法来检测变化并更新其余的可观测值。正确的方法是什么

class Address {
    @observable name;
    @observable line1;
    @observable line2;
    @observable city;
    @observable state;
    @observable zip;
    @observable country;
    ...
}
这听起来似乎适合您的用例

示例(


您希望如何更新其他观测值?对我来说,这听起来像是一个很好的用例,因此您的派生值会自动更新。其他值不是派生的,所以在这种情况下计算是不合适的。一个用例是这样的:根据所选择的国家,我希望将其他观察值默认为该国家的总部-这可能是理想的90%的时间。但是,用户可以自由地将地址更改为其他任何内容。这就是我想观察国家变化并做出适当反应的地方。谢谢你,@Tholle。这是非常有用的。出于好奇,是否可以将
observe()
放在
Address
类中并捕获它的处理器?我真的希望
地址
实例来封装这个逻辑。@Naresh没问题!您可以在需要处置侦听器时执行并调用自定义
destroy
方法。太好了,@Tholle!再次感谢您的帮助。@Naresh太好了!很高兴我能帮忙。
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);