2017-04-12 3 views
2

sich also meine Klasse übernehmen ist so etwas wie diese:Aurelia - kein ModifyCollectionObserver für ein geschachteltes Array, auf das ein computedFrom-Decorator verweist?

import { computedFrom } from 'aurelia-framework'; 

export class Test { 

    myObj; 

    @computedFrom('myObj.myArray') 
    get someProperty() { 
     debugger; 
     return JSON.stringify(this.myObj ? this.myObj.myArray : this.myObj); 
    } 

    attached() { 
     this.myObj = { 
      myArray: [] 
     }; 

     setTimeout(() => this.myObj.myArray.push('foo'), 500); 
    } 

} 

und mein HTML ist einfach:

<template> 
    <h3>myArray value: ${someProperty}</h3> 
</template> 

ich ein Problem habe, wo someProperty nicht aktualisiert wird, wenn ich ein Element in schieben myObj.myArray. Ich habe dies mit dem Debugger im someProperty Getter verifiziert. Wenn this.myObj ursprünglich in attached eingestellt ist und der someProperty Getter anschließend aufgerufen wird, sehe ich, dass myObj ein SetterObserver in this.__observers__ ist.

Aber ich sehe keine ModifyCollectionObserver für myArray in this.myObj.__observers__ (in der Tat, dass __observers__ Eigenschaft gar nicht existiert). Ich würde erwarten, dass es eine Art Beobachter auf dem Array geben würde, da es in meinem computedFrom Decorator als eine Abhängigkeit spezifiziert ist.

+1

Funktioniert '@computedFrom ('myObj.myArray.length')? –

+0

@AshleyGrant Das funktioniert, danke! Wenn Sie das als Antwort lassen, werde ich es akzeptieren. Ich hatte jedoch gehofft, dass es einen weniger hacky Weg geben würde, dies zu tun. –

+0

Ja, ohne Proxies zu benutzen, gibt es leider keinen weniger hacky Weg, den ich kenne. –

Antwort

3

Sie können Ihre computedFrom Dekorateur, um die Änderung folgenden und die Dinge anfangen zu arbeiten:

@computedFrom('myObj.myArray.length') 

Dies liegt daran, die length Eigenschaft ändert sich, wenn Sie ein Element in dem Array schieben, und Aurelia kann diese Änderung beobachten .

Verwandte Themen