Javascript 反应流量|如何将变化传播到其他存储?

Javascript 反应流量|如何将变化传播到其他存储?,javascript,reactjs,flux,Javascript,Reactjs,Flux,我有非常简单的结构1个存储,2个组件(父组件和子组件,父组件更像控制器),动作和常量。现在我不做任何API调用,所有数据都作为道具送到父组件 流程非常简单。在子组件中,任何更改都称为父组件提供的回调 在父组件中,它如下所示: _saveChangedFilters: function(filterObj, filterName) { Actions.setActiveFilters(filterObj, filterName); } 行动: setActiveFilters: functi

我有非常简单的结构1个存储,2个组件(父组件和子组件,父组件更像控制器),动作和常量。现在我不做任何API调用,所有数据都作为道具送到父组件

流程非常简单。在子组件中,任何更改都称为父组件提供的回调

在父组件中,它如下所示:

_saveChangedFilters: function(filterObj, filterName) {
  Actions.setActiveFilters(filterObj, filterName);
}
行动:

setActiveFilters: function(filterObj, filterName) {
  AppDispatcher.dispatch({
    action: Constants.SET_ACTIVE_FILTER,
    filterObject: filterObj,
    filterName: filterName
  });
},
店内:

this.dispatchToken = dispatcher.register(_.bind(function(payload) {
  switch (payload.action) {
    case Constants.MANUFACTURERS_FEED:
      this.setManufacturerStructure(payload.brands, payload.models, payload.facets);
      break;

    case Constants.SET_ACTIVE_FILTER:
      this.setActiveFilters(payload.filterObject, payload.filterName);
      this.emitChange();
      break;

    default:
  }
}, this));
正如您在调用store方法
setActiveFilters
后所看到的,我调用
emitChange
。为此,我在主组件中有一个侦听器:

componentWillMount: function() {
  this.store.addChangeListener(this._onChange);
},

_onChange: function() {
  var newActiveFilters = this._getStoredActiveFilters();
  Actions.changePropagate(newActiveFilters);
  this.setState(newActiveFilters);
},
这里有一个问题<代码>操作。更改传播引发错误:

Uncaught Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
据我所知,错误是抛出的,因为我在上一个操作完成之前发送了新操作。所以我仍然在执行
操作。setActiveFilters
并调用新的


所以,如果我在子组件中有任何更改,我将调度一个操作,我的存储将侦听该操作,这很好。但是我如何添加功能,如果我的存储中有任何更改,我可以发送一个操作,这将是在另一个存储中侦听而不使用
dispatcher.waitFor

您可以在多个存储中使用一个操作

只需重新使用您的
案例常量。在每个相关存储中设置\u ACTIVE\u FILTER:
,并相应地使用该存储的有效负载


作为通量如何运行的规则,“操作”应该是用户提交的“操作”。让代码自动调用action creator是一种边缘用例用法,有点反模式。

为什么不使用
dispatcher.waitFor
?看起来这绝对是实现你想要的最短最简单的方法(在商店1更新后更新商店2)。我不明白。什么是反模式?我描述的流程要求我的存储首先处理数据,并将它们与来自其他过滤器的数据相结合。在此之后,任何更改事件都可以传播到其他存储。其他存储无法侦听SET_ACTIVE_FILTER,因为只有当前已更改的筛选器而不是所有具有筛选器的对象。。。其他存储需要具有所有筛选器的完整对象。