回流商店在一种情况下不听取行动

时间:2015-04-24 07:43:01

标签: javascript reactjs refluxjs

我有一个正在收听“客户加载”的回流商店。行动。此操作为商店提供客户详细信息。当商店收到新的或更新的客户信息时,会触发通知收听新客户或更新的客户详细信息。

(所有代码都已从荷兰语翻译成英语,因此可能会有一两个错字)

var CustomerStore = Reflux.createStore({
init: function ()
{
    this.listenTo(CustomerActions.customerLoaded, this._onCustomerLoaded);
},
// handlers
_onCustomerLoaded: function (data)
{
    if (data)
    {
        _customers[data.Number] = data;
        this.trigger(data.Number);
    }
},
getCustomer: function(number)
{
  var customer = null;
  if(_customers[number])
  {
    customer = _customers[number];
  }
  else
  {
    CustomerActions.loadCustomer(number);
  }
  return customer;
}
});

我有我的反流行动。

var CustomerActions = Reflux.createActions(
[
  "loadCustomer",
  "customerLoaded",
  "setEmail",
]
);

CustomerActions.loadCustomer.preEmit = function (number)
{
    if (!number|| number=== 0 || number=== '')
    {
        CustomerActions.customerLoaded(null);
    }
    else
    {
      // request details from server
      CustomerApi.getCustomerByNumber(number)
        .done(function (data)
          {
              // send details to the store
              CustomerActions.customerLoaded(data);
           }
        );
    }
};

CustomerActions.setEmail.preEmit = function (number, newValue)
{
  if(number && number !== 0 && number !== '')
  {
    // send updated email address to server
    CustomerApi.setEmail(number, newValue)
      .done(function (result)
      {
        if(result)
        {
          // start action to load customer details from the server
          CustomerActions.loadCustomer(number);
        }
        // else.. TODO: ...
      });
      }
    };

使用setEmail操作时会出现问题。实际上,此操作的工作方式与应该的一致,并且电子邮件地址在服务器上更新。甚至触发了从服务器重新加载客户详细信息的操作,但在loadCustomer.preEmit中,当&CustomerConctions.customerLoaded(数据)'动作被触发。 CustomerStore不响应此操作。 '数据'参数包含预期的数据,因此不是问题。

最奇怪的是,要在屏幕上初始显示客户详细信息,使用CustomerActions.loadCustomer和CustomerStore的相同组合时没有任何问题。当我用它来显示不同客户的详细信息时,这种组合仍然有效。

是否有人知道可能存在什么问题,或者我可以做些什么来检查商店为什么不响应行动?

提前致谢!

2 个答案:

答案 0 :(得分:2)

尝试使用示例异步工作流重写代码,而不是使用preEmit钩子。如果你需要验证,我认为你应该使用shouldEmit hook而不是preEmit。但首先尝试没有钩子。 https://github.com/spoike/refluxjs#asynchronous-actions

也许这会有所帮助。

答案 1 :(得分:1)

问题已通过“要求”应该处理来自JS文件的te操作的商店以及启动更改电子邮件地址的视图(调用CustomerActions.setEmail操作)来解决。这个解决方案不符合我的期望。我期望,因为商店已经被使用(并且正在运行),它已经在内存中,因此应该响应监听器注册的操作。