Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MobX自动运行行为_Javascript_Mobx - Fatal编程技术网

Javascript MobX自动运行行为

Javascript MobX自动运行行为,javascript,mobx,Javascript,Mobx,我正在探索MobX,被一个问题吸引住了: 如果我能观察到这一点: class ItemsStore { @observable items = [1,2,3]; } const store = new ItemsStore; 然后像这样改变它: setInterval(() => { store.items[0] = +new Date }, 1000) 我注意到以下几点: autorun(()=>console.log(store.items)) autorun((

我正在探索MobX,被一个问题吸引住了:

如果我能观察到这一点:

class ItemsStore {
    @observable items = [1,2,3];
}
const store = new ItemsStore;
然后像这样改变它:

setInterval(() => {
    store.items[0] = +new Date
}, 1000)
我注意到以下几点:

  • autorun(()=>console.log(store.items))
  • autorun(()=>console.log(store.items[0])
  • autorun(()=>console.log(store.items.length))
这背后的API逻辑是什么?我希望由于
store.items
从不激发,所以未更改的属性也会表现相同

为什么MobX知道我的回调中有什么代码?是否正在分析我传递给
自动运行的回调?

console.log(store.items)

当上次自动运行中取消引用的观测值发生更改时,将触发自动运行<代码>存储。项
不取消对任何可观察项的引用。尝试
store.items.slice()
store.items.toJS()
以获得所需的效果

console.log(store.items[0])

这是因为取消引用的可观察对象已更改而触发的

console.log(store.items.length)

这是因为MobX数组不是真正的数组而运行的。
length
属性是:

getArrayLength


根据文档,自动运行不仅观察todo数组,而且还观察todo项中的各个属性。因此,我猜如果数组中的任何项正在主动disparying value或使用value进行任何其他计算,则自动运行将触发。否则,不会的,在文件里有一个很好的解释,关于这个…塔克·索勒!(谢谢!)@Rikard Det var sålite så.:)
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(): number {
    this.atom.reportObserved();
    return this.values.length;
}