2017-10-18 3 views
2

J'essaye d'écouter une valeur change avec l'expression calculée mobx, mais je ne vois aucun changement quand je pousse une nouvelle valeur à l'expression observée.Mobx écouter une valeur change avec calculé ne fonctionne pas

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(); 

Pourquoi cela ne fonctionne-t-il pas?

Répondre

1

Notez que computed ne fera que suivre les données auxquelles il accède réellement. La seule donnée accessible dans votre calcul est le changes, un pointeur vers un tableau. Pousser une nouvelle valeur à ce tableau ne changera pas le pointeur. Rappelez-vous: calculé produire des valeurs, les réactions & autoruns produisent des effets secondaires.

Votre ordinateur n'a jamais généré de nouvelle valeur et ne déclenche donc jamais le observer.

+0

Une nouvelle valeur === une nouvelle référence? – JsFan

+0

oui (ce comportement peut être personnalisé si) – mweststrate

0

computed est utilisée lorsque vous voulez dériver une nouvelle valeur à partir d'autres observables. Vous pouvez utiliser à la place observe:

Exemple (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);