Как лучше всего объявлять глобальные действия в Mobx-State-Tree?

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

const Contacts = types.model( 'Contacts', {
    items: types.array(types.string)
}).actions(self=>({
    show: flow(function* fetchData(){
        // somehow indicate start of the loading process
        self.items = yield fetch();
        // somehow indicate end of the loading process
    }) 
}));

const Store = types.model('AppStore', {
    loading: types.optional(types.boolean, false),
    contacts: Contacts
}).actions(self => ({
    toggle() {
        self.loading = !self.loading;
    }
}));

Хотя я, безусловно, могу использовать getRoot, это принесет определенные неудобства при тестировании и снизит общую прозрачность дизайна.

Возможно, можно использовать ленивую композицию и экспорт экземпляров вместе с объявлениями модели из модуля, но для меня это выглядит еще более странным.

Каков предлагаемый способ решения таких проблем в Mobx-State-Tree?


person wallice    schedule 31.01.2018    source источник


Ответы (1)


Я думаю, вы можете использовать types.reference и types.late в своих моделях, которые спускаются по дереву для доступа к корневым действиям.

person frontden    schedule 01.02.2018
comment
Эталонный подход выглядит законным, но следует помнить о том, что он должен быть необязательным типом, а ключ должен использоваться совместно между моделями. - person wallice; 09.02.2018