跨商店的扩展事件发射器功能在Flux中发生冲突

时间:2015-02-04 21:51:58

标签: reactjs reactjs-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;

1 个答案:

答案 0 :(得分:3)

  

商店似乎是从其他商店扩展的一个大型对象。

如果您从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, {