我一直在玩 React/Flux,但在处理对权限敏感的操作时遇到了麻烦。
首要问题:当未登录的访问者尝试要求他/她登录的操作时,Flux 的方式是什么(a)检查用户是否已登录,(b)启动登录流程,(c ) 完成动作就成功了?
以论坛应用程序为例,该应用程序需要用户登录才能发帖:
我们有一个评论表单组件(主要取自 FB 的 React tut),如下所示:
var CommentForm = React.createClass({
handleSubmit: function ( e ) {
e.preventDefault();
// get data
commentData = {
content: this.refs.content.getDOMNode().value.trim()
};
this.props.onCommentSubmit( commentData );
this.resetForm();
},
resetForm: function () {
this.refs.content.getDOMNode().value = '';
},
render: function () {
return (
<form className="comment-form" id="comment-form" onSubmit={ this.handleSubmit }>
<textarea name="comment[content]" placeholder="What's on your mind?" ref="content"></textarea>
<button className="post-comment button" type="submit">Post</button>
</form>
)
}
});
评论商店(缩写)
var CHANGE_EVENT = 'change';
var _comments = {};
function createComment ( data ) {
// post to server
}
var CommentStore = React.addons.update(EventEmitter.prototype, {$merge: {
// omitted methods
dispatcherIndex: AppDispatcher.register(function(payload) {
var action = payload.action;
var text;
switch(action.actionType) {
case CommentConstants.ADD_COMMENT:
AppDispatcher.waitFor([SessionStore.dispatchToken])
createComment(action.data);
break;
}
return true;
})
}});
还有一个处理会话的商店(也缩写):
var CHANGE_EVENT = 'change';
function ensureCurrentUser () {
if ( !SessionStore.currentUser() ) {
app.router.navigate('/login');
}
}
var SessionStore = React.addons.update(EventEmitter.prototype, {$merge: {
// omitted code
currentUser: function () {
return app.context.current_user;
},
dispatchToken: AppDispatcher.register(function ( payload ) {
var action = payload.action;
switch(action.actionType) {
case CommentConstants.ADD_COMMENT:
ensureCurrentUser();
break;
}
return true;
})
}});
我最初的想法是,这是 FluxwaitFor()方法的一个案例。但是,上面的实现失败了,waitFor因为一旦设置就关闭依赖循环SessionStore.dispatchToken(一旦ensureCurrentUser返回)。
在这种情况下,负载应该被传递到ensureCurrentUser,然后再传递到路由处理程序中/login吗?处理这些类型的流的 Flux 方式是什么?
提前致谢 :)