2016-12-11 19 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

**だけドス・アレイが自動実行で観測されたが、また、TODO項目内の個々のプロパティされていません* *配列内の項目が積極的に値を表示しているか、または他の計算に値を使用しているかどうかを推測します。自動実行します.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:ドキュメントを1として

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

Tack Tholle! (ありがとうございました!) – Rikard

+1

@Rikard Det varsåliteså。 :) – Tholle