1

プロジェクトの 1 つで Flux アーキテクチャを使用しようとしています。

一部のアクションには、そのアクションをディスパッチできるようにするために満たす必要がある前提条件があります。

現在、この前提条件のチェック ロジックは、次のようなビュー コード内にあります (疑似コード):

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

ビューの内部にビジネス ロジック コードが含まれているため、これは私には厄介に見えます。このチェック コードをストアに入れようと思ったのですが、できません。このアクションを処理する複数のストアがあり、有効かどうかを知っているストアは 1 つだけです。だからうまくいきません:

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 があるとしたら、どうすればよいでしょうか? アクションの実行が許可されていない場合、ユーザーのキーボードからスペースバーを削除できません。

PS 私は React を使用していないので、質問は純粋に Flux アーキテクチャ スタイルに関するものであり、JavaScript も使用していません。

4

2 に答える 2

0

ActionDispatcher検証を処理する新しいコンポーネント ( ) を作成しました。

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

次に、ビュー (およびその他のアクション ソース) はActionDispatcher、アクションを直接ディスパッチする代わりに、常に を使用します。

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

検証コードを 1 つの場所にまとめました。

于 2015-01-13T10:35:17.520 に答える