Reflux store 在一种情况下不听动作
Reflux store is in one situation not listening to an action
我有一个正在监听 'customerLoaded' 动作的 Reflux 商店。此操作向商店提供客户详细信息。当商店收到新的或更新的客户信息时,它会被触发以通知新的或更新的客户详细信息的监听组件。
(所有代码均已从荷兰语翻译成英语,因此可能会有一两个错字)
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 中,当 'CustomerActions.customerLoaded(data)' 操作被触发时什么也没有发生。 CustomerStore 不响应此操作。 'data' 参数包含预期的数据,所以这不是问题。
最奇怪的是,最初在屏幕上显示客户详细信息时,使用了 CustomerActions.loadCustomer 和 CustomerStore 的相同组合,没有出现任何问题。当我用它来显示不同客户的详细信息时,这种组合仍然有效。
有没有人知道可能是什么问题,或者我可以做些什么来检查为什么商店不响应该操作?
提前致谢!
尝试使用示例异步工作流而不是使用 preEmit 挂钩重写您的代码。如果您需要验证,我认为您应该使用 shouldEmit 钩子而不是 preEmit。但首先尝试完全不使用钩子。
https://github.com/spoike/refluxjs#asynchronous-actions
也许这会有所帮助。
问题已通过 'requiring' 商店解决,该商店应使用启动电子邮件地址更改的视图(调用 CustomerActions.setEmail 操作)处理 JS 文件中的操作。这个解决方案不符合我的期望。我预计,因为商店已经在使用(并且正在工作),它已经在内存中,因此应该响应注册侦听器的操作。
我有一个正在监听 'customerLoaded' 动作的 Reflux 商店。此操作向商店提供客户详细信息。当商店收到新的或更新的客户信息时,它会被触发以通知新的或更新的客户详细信息的监听组件。
(所有代码均已从荷兰语翻译成英语,因此可能会有一两个错字)
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 中,当 'CustomerActions.customerLoaded(data)' 操作被触发时什么也没有发生。 CustomerStore 不响应此操作。 'data' 参数包含预期的数据,所以这不是问题。
最奇怪的是,最初在屏幕上显示客户详细信息时,使用了 CustomerActions.loadCustomer 和 CustomerStore 的相同组合,没有出现任何问题。当我用它来显示不同客户的详细信息时,这种组合仍然有效。
有没有人知道可能是什么问题,或者我可以做些什么来检查为什么商店不响应该操作?
提前致谢!
尝试使用示例异步工作流而不是使用 preEmit 挂钩重写您的代码。如果您需要验证,我认为您应该使用 shouldEmit 钩子而不是 preEmit。但首先尝试完全不使用钩子。 https://github.com/spoike/refluxjs#asynchronous-actions
也许这会有所帮助。
问题已通过 'requiring' 商店解决,该商店应使用启动电子邮件地址更改的视图(调用 CustomerActions.setEmail 操作)处理 JS 文件中的操作。这个解决方案不符合我的期望。我预计,因为商店已经在使用(并且正在工作),它已经在内存中,因此应该响应注册侦听器的操作。