Я пытаюсь понять шаблон потока.Как избежать цепей действия
Я считаю, что в любом хорошем дизайне приложение должно состоять из относительно независимых и универсальных (и, следовательно, многократно используемых) компонентов, склеенных с помощью конкретной прикладной логики.
В Flux есть специфические для домена магазины, инкапсулирующие данные и логику домена. Возможно, они могут быть повторно использованы в другом приложении для того же домена.
Я предполагаю, что также должны быть приложения, в которых хранятся состояние приложения и логика. Это клей.
Теперь я пытаюсь применить это к воображаемой "GPS Tracker" приложение:
...
Когда пользователь нажимает кнопку [Stop Tracking], соответствующий ViewController поднимает STOP_CLICK
.
AppState.on(STOP_CLICK):
dispatch(STOP_GEOLOCATION)
dispatch(STOP_TRACKING)
GeolocationService.on(STOP_GEOLOCATION):
stopGPS(); this.on = false; emit('change')
TrackStore.on(STOP_TRACKING):
saveTrack(); calcStatistics(); this.tracking = false; emit('change')
dispatch(START_UPLOAD)
Итак, у меня есть снежный ком событий.
Говорят, что в Flux одно действие не должно поднимать другого. Но я не понимаю, как это можно сделать.
Я думаю, что действия пользователя не могут перейти непосредственно в магазины домена, поскольку они должны быть UI-агностиками. Скорее AppState (или везде, где работает логика приложения) должен переводить действия пользователя в действия домена.
- Как переделать этот поток Flux?
- Куда должна следовать логика приложения?
- Правильно ли пытаться сохранить магазины домена независимо от логики приложения?
- Где находится место для «услуг»?
спасибо.
Похоже, мое желание «иметь AppStore для организации доменных магазинов» несовместимо с Flux. Является ли ваш ответ на то, чтобы сделать объекты, специфичные для домена, реагировать на действия пользовательского интерфейса напрямую (и, таким образом, сделать их специфичными для приложения) и не преследовать мифическую независимость и возможность повторного использования? Спасибо – sas18
В TRACKING_STOPPED ничего особенного приложения нет. Тем не менее, есть что-то особенное, связанное с отслеживанием. Поэтому, если вы хотите, чтобы GeolocationStore смог ответить на это, вам нужно написать код для этого. К счастью, диспетчер уже отправляет все действия во все магазины, так что вы на полпути. Предположим, после того, как вы напишете этот код, вы хотите переместить GeolocationStore в приложение, которое не использует отслеживание. У вас будет лишний материал в GeolocationStore, который вы не используете? Да. Но это не делает его зависимым от пользовательского интерфейса или иным образом не используется повторно. – fisherwebdev
Все еще непонятно. Итак, когда пользователь нажимает кнопку, какой-то ViewController запускает TRACKING_STOPPED и сохраняет обновления. Теперь мне нужно отобразить диалоговое окно подтверждения пользователю. Итак, я изменяю действие, инициированное TRACKING_STOP_REQUEST, и изменения AppStore, чтобы отобразилось подтверждение, которое будет или не будет расти TRACKING_STOPPED. Пока все хорошо. Теперь я добавляю в AppStore некоторую логику, определяющую, нужно ли нам это подтверждение или нет: 'if (needConfirmation) this.state.showStopConfirmation = true else fire (TRACKING_STOPPED)' Итак, у меня есть цепочка действий. Как с этим справиться? Спасибо. – sas18