2016-12-11 43 views
4

我探索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

+0

作爲每**不只是待辦事項陣列是由自動運行觀察到,但也待辦事項內的各個屬性*的文檔*被察覺。所以我猜如果數組中的任何項目正在顯示值或使用任何其他計算值,然後自動運行fires.Else,它不會。在文檔中有一個很好的解釋否認這一點.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 varsåliteså。 :) – Tholle