注意:我的问题是关于包含/传递调度程序实例的方式,而不是模式如何有用。
我正在研究Flux架构,我无法理解调度员(实例)的概念可能被包含在任何地方......
如果我想从模型层触发动作怎么办?在我的模型文件中包含一个对象的实例对我来说感觉很奇怪...我觉得这缺少了一些注入模式......
我的印象是确切的PHP等价物是(感觉)可怕的类似于:
<?php
$dispatcher = require '../dispatcher_instance.php';
class MyModel {
...
public function someMethod() {
...
$dispatcher->...
}
}
我认为我的问题并不仅仅与Flux架构有关,而是与NodeJS的“做事方式”/做法有关。
答案 0 :(得分:0)
您的代码与React不完全对齐,因为您正在数据存储上创建公共可变函数。
与Flux中的商店进行通信的 ONLY 方式是通过message passing,它始终通过调度程序。
例如:
var Dispatcher = require('MyAppDispatcher');
var ExampleActions = require('ExampleActions');
var _data = 10;
var ExampleStore = assign({}, EventEmitter.prototype, {
getData() {
return _data;
},
emitChange() {
this.emit('change');
},
dispatcherKey: Dispatcher.register(payload => {
var {action} = payload;
switch (action.type) {
case ACTIONS.ADD_1:
_data += 1;
ExampleStore.emitChange();
ExampleActions.doThatOtherThing();
break;
}
})
});
module.exports = ExampleStore;
通过关闭_data
而不是直接在商店中拥有data
属性,您可以强制执行消息传递规则。这是私人会员。
同样重要的是要注意,虽然你可以直接调用Dispatcher.emit(),但这不是一个好主意。
通过动作创建者有两个主要原因:
ADD_1
操作,此代码将抛出异常而不是通过发送与任何不匹配的消息无声地失败在任何商店中切换语句调试示例:
var MyAppDispatcher = require('MyAppDispatcher');
MyAppDispatcher.register(payload => {
console.debug(payload);
});