2014-12-19 2 views
1

Я пытаюсь использовать архитектуру Flux в одном из моих проектов.Кто сказал, что действие разрешено в 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)», а затем попросите его, но это заставит каждый магазин, который обрабатывает это действие, чтобы содержать такая же проверка, приводящая к чему-то действительно грязному.

До сих пор я понимаю, что Action in Flux отправляется только в том случае, если это гарантировано, i.e. действительность действия необходимо проверить перед отправкой. Это означает, что эта проверка должна быть в представлении?

Решение на примере вышеприведенного примера может быть простым: «просто спрячьте кнопку, когда она не разрешена, и этого никогда не произойдет». Но предположим, что у меня есть действие, которое отправляется, когда пользователь попадает в пробел, что мне делать? Я не могу удалить пробел с клавиатуры пользователя, когда действие не разрешено.

P.S. Я не использую React, поэтому вопрос касается только архивного стиля Flux, я даже не использую JavaScript.

ответ

0

Я создал новый компонент (ActionDispatcher) для обработки валидаций:

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

Тогда мнение (и другие источники действий) всегда используют ActionDispatcher, вместо того, чтобы диспетчерские действия непосредственно:

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

Я только что организовал код проверки в одном месте.

0

Возможно, это вопрос степени. Я не рассматриваю простую проверку собственности, управляемой магазином, как бизнес-логику. Я считаю, что очень простой вид логики:

if (FooStore.IsButtonClickAllowed) {

Эта линия, кажется, абстрагируются все правила о том, почему кнопка не может быть интерактивными, и, похоже, все, что получает удалось в магазине, что является уместным.

Действие в Flux отправляется только в том случае, если это гарантировано, то есть действительность действия должна быть проверена перед отправкой.

Я не согласен с этим. Существуют различные виды проверки.

Иногда очень простая проверка может быть выполнена в компоненте вида. В React компоненты могут использовать небольшую степень состояния. Компоненты ввода - это особенно хорошие места для этого. Например, проверка того, что пользователь набрал то, что выглядит как адрес электронной почты, может быть выполнен в компоненте вида.

Большая проверка, однако, должна быть выполнена против состояния приложения или постоянных данных. В этих случаях вам нужно отправить действие, а затем позволить магазинам отвечать на него бизнес-логикой.

Действие должно быть похоже на газету, сообщая о чем-то, что произошло в реальном мире: пользователь что-то сделал, ответ вернулся с сервера и т. Д. Действия не нужно предотвращать; они сообщают о том, что на самом деле произошло. Магазины делают все остальное.

Когда пользователь делает что-то, что нарушает правила проверки, магазины отвечают на это, предоставляя данные об ошибках в представлениях.

+0

Я вижу вашу точку зрения. Но, поскольку действие должно быть газетой, оно не может быть отправлено, когда оно недействительно. Если один магазин отвечает на него с «ошибкой», это действие по-прежнему отправляется в другие магазины, а в других магазинах может изменяться определенное состояние, которое им не нужно. Я использую новый «компонент» под названием «ActionDispatcher», который выполняет необходимые проверки перед отправкой действий, поэтому представления всегда запрашивают «ActionDispatcher» что-то делать, т. Е. * Представление не отправляет действие напрямую. –

Смежные вопросы