Реакция не вызывается, когда магазин обновляется в конструкторе; - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть два магазина, и второй магазин должен обновляться на основе обновлений из первого магазина.Первый магазин:

import {decorate} from 'mobx';
export class EntryStore {
    constructor (parent_store) {
        this.parent_store = parent_store;
        this.entries = [];
        console.log('----------------------');
        setTimeout(() => this.entries.push({event: 0, id: 0}), 1000);
        console.log('constructed;')
    }
}

decorate(EntryStore, {
    entries: observable,
});

Второй магазин:

import {decorate, reaction} from 'mobx';
export class EventStore {
    constructor(parent_store) {
        this.parent_store = parent_store;
        this.events = new Map();
        this.entry_load_disposer = reaction(
            () => this.parent_store.entryStore.entries.map(e => e),
            async (event_ids) => {
                console.log('we are getting events');
                return this.loadSomeDataPromise();
            }
        );
    }
}

decorate(EventStore, {
    events: observable,
});

И для полноты пользы "parent_store":

import {EventStore} from "./EventStore";
import {EntryStore} from "./EntryStore";

export default class RootStore {
    constructor() {
        this.entryStore = new EntryStore(this);
        this.eventStore = new EventStore(this);
    }
}

Я ожидаю, что реакция запуститсяmsgstr "сразу после загрузки entryStore".однако это не так, реакция не запускается вообще.Как так?Где я допустил ошибку?

1 Ответ

0 голосов
/ 28 ноября 2018

Попробуйте разыменовать свойство length возвращаемого массива с карты, например, так:

   this.entry_load_disposer = reaction(
        () => this.parent_store.entryStore.entries.map(e => e).length,
        (event_ids) => {
            console.log('we are getting events');
            return this.loadSomeDataPromise();
        },
       {
        fireImmediately: true
       }
    );

Я предлагаю также удалить асинхронную синхронизацию, если только для этого нет причины.Также проверьте Понимание того, что MobX реагирует на

...