跨商店的扩展事件发射器功能在 Flux 中发生冲突
Extended event emitter functions across stores are clashing in Flux
我有多家 Flux 商店。现在很明显,它们都在扩展同一个事件发射器单例。这导致商店之间的事件相互冲突(即使是最常见的 emitChange
)。 Store1.getID()
和 Store2.getID()
之间似乎没有区别,因为商店似乎是从其他所有商店扩展而来的一个大对象。我做错了什么?
这个问题我已经有一段时间了,这让我抓狂。我确信这有一个我所缺少的简单答案。这是我等待中继和 GraphQL 的原因之一。
编辑:我的所有商店在代码中的样子。
var Events = require('events'), extend = require('deep_extend'),
EventEmitter = Events.EventEmitter,
CHANGE_EVENT = 'change';
var SomeStore = extend(EventEmitter.prototype, {
someGetter: function(){
return _someVar;
},
dispatchToken: AppDispatcher.register(function(action) {
switch(action.type) {
case 'SOME_ACTION':
_someVar = 'someValue'
break;
default:
return true;
}
SomeStore.emitChange();
return true;
})
});
return SomeStore;
stores seem to be one large object extended from every other store.
你从 EventEmitter
扩展的方式一定有问题,否则你的代码应该可以正常工作。
既然有几种方法可以做同样的事情,下面是 facebook 在他们的 official examples 中实现它的方法:
var assign = require('object-assign');
var EventEmitter = require('events').EventEmitter;
var TodoStore = assign({}, EventEmitter.prototype, {
...
更新
现在查看您的代码
extend(EventEmitter.prototype, {
实际上是在原型本身上书写,因此出现了错误。相反,您应该扩展一个空对象:
extend({}, EventEmitter.prototype, {
我有多家 Flux 商店。现在很明显,它们都在扩展同一个事件发射器单例。这导致商店之间的事件相互冲突(即使是最常见的 emitChange
)。 Store1.getID()
和 Store2.getID()
之间似乎没有区别,因为商店似乎是从其他所有商店扩展而来的一个大对象。我做错了什么?
这个问题我已经有一段时间了,这让我抓狂。我确信这有一个我所缺少的简单答案。这是我等待中继和 GraphQL 的原因之一。
编辑:我的所有商店在代码中的样子。
var Events = require('events'), extend = require('deep_extend'),
EventEmitter = Events.EventEmitter,
CHANGE_EVENT = 'change';
var SomeStore = extend(EventEmitter.prototype, {
someGetter: function(){
return _someVar;
},
dispatchToken: AppDispatcher.register(function(action) {
switch(action.type) {
case 'SOME_ACTION':
_someVar = 'someValue'
break;
default:
return true;
}
SomeStore.emitChange();
return true;
})
});
return SomeStore;
stores seem to be one large object extended from every other store.
你从 EventEmitter
扩展的方式一定有问题,否则你的代码应该可以正常工作。
既然有几种方法可以做同样的事情,下面是 facebook 在他们的 official examples 中实现它的方法:
var assign = require('object-assign');
var EventEmitter = require('events').EventEmitter;
var TodoStore = assign({}, EventEmitter.prototype, {
...
更新
现在查看您的代码
extend(EventEmitter.prototype, {
实际上是在原型本身上书写,因此出现了错误。相反,您应该扩展一个空对象:
extend({}, EventEmitter.prototype, {