我有非常简单的结构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));
正如您在调用商店方法setActiveFilters
后所看到的,我致电emitChange
。为此我在主要组件中有一个监听器:
componentWillMount: function() {
this.store.addChangeListener(this._onChange);
},
_onChange: function() {
var newActiveFilters = this._getStoredActiveFilters();
Actions.changePropagate(newActiveFilters);
this.setState(newActiveFilters);
},
这是一个问题。 Actions.changePropagate
抛出错误:
Uncaught Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
据我所知,错误被抛出,因为我在上一次完成之前发出新动作。所以我仍然在Actions.setActiveFilters
期间打电话给新人。
所以,如果我对子组件进行了任何更改,我会调度一个动作,我的商店会听,这样做很好。但是我怎样才能添加功能,如果我的商店中有任何更改,我可以发送一个动作,在不使用dispatcher.waitFor
的情况下在另一个商店中收听?
答案 0 :(得分:0)
您可以在多个商店中使用一个操作。
只需在每个相关商店中重复使用case Constants.SET_ACTIVE_FILTER:
,并相应地使用该商店的有效负载。
作为助焊剂如何运作的规则,"行动"应该确实是用户提交的" actions" 。让代码自动调用动作创建者是一种边缘用例,而且有点反模式。