2017-10-18 3 views
2

Ich versuche, einen Wert zu hören ändert sich mit mobx berechneten Ausdruck, aber ich sehe keine Änderungen, wenn ich einen neuen Wert auf den beobachteten Ausdruck drücken.Mobx höre auf einen Wert ändert sich mit berechnet funktioniert

class List { 
    @observable values = []; 

    constructor() { 
    computed(() => this.values).observe(changes => { 
     console.log(changes); 
    }) 
    } 


    add(item) { 
    this.values.push(Math.random()); 
    } 

} 

const list = new List(); 
list.add(); 

Warum funktioniert es nicht?

Antwort

1

Beachten Sie, dass computed nur Daten verfolgen wird es tatsächlich zugreift. Die einzigen Daten, auf die in Ihrem Computer zugegriffen wird, sind changes, ein Zeiger auf ein Array. Wenn Sie diesem Array einen neuen Wert hinzufügen, wird der Zeiger nicht geändert.

Denken Sie daran: Berechnungen produzieren Werte, Reaktionen & Autoruns produzieren Nebenwirkungen.

Ihr Computer erzeugt nie einen neuen Wert und löst daher niemals den Wert observer aus.

+0

Ein neuer Wert === eine neue Referenz? – JsFan

+0

ja (dieses Verhalten kann jedoch angepasst werden) – mweststrate

0

computed wird verwendet, wenn Sie einen neuen Wert von anderen Observablen ableiten möchten. Sie könnten observe statt:

Beispiel (JSBin)

class List { 
    @observable values = []; 

    constructor() { 
    observe(this.values, (change) => { 
     if (change.added) { 
     console.log(`${change.added} got added to values`); 
     } 
    }); 
    } 

    add(item) { 
    this.values.push(Math.random()); 
    } 
} 

const list = new List(); 

setInterval(() => { 
    list.add(); 
}, 1000); 
Verwandte Themen