1

我正在尝试在我的一个项目中使用 Flux 架构。

我的一些操作具有需要满足的先决条件才能允许分派该操作。

目前,这个先决条件检查逻辑在我的视图代码中,像这样(伪代码):

class FooView {
    void OnButtonClick() {
        if (FooStore.IsButtonClickAllowed) {
            Dispatch(ButtonClickAction);
        }
    }
}

这对我来说看起来很尴尬,因为现在我的视图里面有业务逻辑代码。我很想把这个检查代码放到我的商店里,但我做不到。我有不止一个商店来处理这个动作,只有一个商店知道它是否有效。所以它不起作用:

class FooStore {
    void Handle(Action) {
        if (Action is ButtonClickAction) {
            if (IsButtonClickAllowed) {
                FooData.Something();
            } else {
                // Ignore
            }
        }
    }
}

class BarStore {
    void Handle(Action) {
        if (Action is ButtonClickAction) {
            BarData.Something();
        }
    }
}

我无法判断BarStore是否ButtonClickAction允许,除非我“ WaitFor(FooStore)”然后询问它,但这将导致处理此操作的每个商店都包含相同的检查,从而导致一些非常混乱的事情。

到目前为止,我了解到 Flux 中的 Action 只有在保证允许的情况下才会被调度,在调度之前需要检查 Action 的有效性。这意味着这个验证需要在视图中?

上面按钮示例的解决方案可能很简单:“在不允许的时候隐藏按钮,它永远不会发生”。但是假设我有一个 Action 在用户点击空格键时被调度,我该怎么办?当不允许发生操作时,我无法从用户键盘上删除空格键。

PS 我没有使用 React,所以问题纯粹是关于 Flux 架构风格,我什至没有使用 JavaScript。

4

2 回答 2

0

也许这是一个程度的问题。我不认为对商店管理的属性进行简单检查是业务逻辑。我认为这是非常简单的视图逻辑:

if (FooStore.IsButtonClickAllowed) {

这条线似乎已经抽象出关于为什么按钮可能不可点击的所有规则,并且看起来所有这些都在商店中进行管理,这是适当的。

Flux 中的Action 只有在保证被允许的情况下才会被调度,即在调度之前需要检查Action 的有效性。

我不同意这一点。有不同类型的验证。

有时可以在视图组件中完成非常简单的验证。在 React 中,组件可能会使用少量的状态。输入组件是执行此操作的特别好地方。例如,检查用户是否输入了类似于电子邮件地址的内容,可以在视图组件中完成。

然而,大多数验证需要针对应用程序状态或持久数据进行。在这些情况下,您需要发送操作,然后让商店使用业务逻辑对其进行响应。

动作应该像报纸一样,报道现实世界中发生的事情:用户做了某事,服务器返回了响应等。动作不需要阻止发生;他们报告实际发生的事情。商店完成其余的工作。

当用户做了违反验证规则的事情时,商店会通过向视图提供错误数据来对此做出响应。

于 2014-12-28T04:07:12.880 回答
0

我创建了一个新组件 ( ActionDispatcher) 来处理验证:

class ActionDispatcher {
    void ButtonClick() {
        if (FooStore.IsButtonClickAllowed) {
            Dispatch(ButtonClickAction);
        }
    }
}

然后,视图(和其他动作源)总是使用ActionDispatcher,而不是直接调度动作:

class FooView {
    void OnButtonClick() {
        ActionDispatcher.ButtonClick();
    }
}

我刚刚将验证代码组织到一个位置。

于 2015-01-13T10:35:17.520 回答