2016-12-11 2 views
4

Я изучаю MobX и пошел заинтригована проблемой:MobX поведение автозапуска

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

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

, а затем изменить его следующим образом:

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

I отметили следующее:

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

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

+0

В соответствии с Документами ** не только массив Todos наблюдается в автозапуск, но и индивидуальные свойства внутри элементов списка задач * * наблюдаются. Поэтому я предполагаю, что если какой-либо элемент в массиве активно рассылает значение или использует значение для любого другого вычисления, то автозапуск запускается. Едва, это не будет. В документах, имеющих reagarding this..https://mobxjs.github.io/mobx/getting-started.html – pritesh

ответ

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 является defined as follows:

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

getArrayLengthreports that the MobX array has been observed:

getArrayLength(): number { 
    this.atom.reportObserved(); 
    return this.values.length; 
} 
+0

Tack Tholle! (Спасибо!) – Rikard

+1

@Rikard Det var så lite så. :) – Tholle

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