Поведение автозапуска MobX

Я изучаю MobX и меня заинтриговала проблема:

Если у меня есть это наблюдаемое:

class ItemsStore {
    @observable items = [1,2,3];
}
const store = new ItemsStore;

а затем измените его так:

setInterval(() => {
    store.items[0] = +new Date
}, 1000)

Заметил следующее:

Какая логика API за этим стоит? Я ожидал, что, поскольку store.items никогда не срабатывает, эти неизмененные свойства будут вести себя так же.

И почему MobX знает, какой код находится внутри моего обратного вызова? анализирует ли он мой обратный вызов, который я передаю autorun?


person Rikard    schedule 11.12.2016    source источник
comment
В соответствии с документами при автозапуске наблюдается не только массив задач, но и отдельные свойства внутри элементов задач. Поэтому я предполагаю, что если какой-либо элемент в массиве активно отображает значение или использует значение для любых других вычислений, а затем запускается автозапуск. Иначе не будет. В документации есть хорошее объяснение по этому поводу .. mobxjs.github.io/mobx/getting-started.html   -  person pritesh    schedule 11.12.2016


Ответы (1)


console.log (store.items)

Автозапуск запускается, когда изменяются наблюдаемые объекты, которые были разыменованы в последнем автозапуске. store.items не разыменовывает наблюдаемые. Попробуйте store.items.slice() или store.items.toJS(), чтобы получить желаемый эффект.

console.log (store.items [0])

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

console.log (store.items.length)

Это выполняется, потому что массив MobX не является настоящим массивом. Свойство length определяется следующим образом :

Object.defineProperty(ObservableArray.prototype, "length", {
    enumerable: false,
    configurable: true,
    get: function(): number {
        return this.$mobx.getArrayLength();
    },
    set: function(newLength: number) {
        this.$mobx.setArrayLength(newLength);
    }
});

getArrayLength сообщает, что обнаружен массив MobX :

getArrayLength(): number {
    this.atom.reportObserved();
    return this.values.length;
}
person Tholle    schedule 12.12.2016
comment
Tack Tholle! (Спасибо!) - person Rikard; 17.12.2016
comment
@Rikard Det var så lite så. :) - person Tholle; 17.12.2016