2016-12-05 5 views
2

Aureliaコンポーネントは、アイテムのリストを表示することになっています。コンポーネントのモデルはバインド可能である「アイテム」プロパティがあります:私はから私のバインドされた配列に新しい項目を押すとコレクションが変更されたとき、Aurelia CollectionObserverハンドラはトリガされません

<div repeat.for="item of items"> 
    ${item.id} </div> 

@bindable items = []; 

をコンポーネントテンプレートは、単純な繰り返しの属性を使用してリストを表示しますコンポーネントが使用されているページのビューモデルでは、リストが更新されて新しいアイテムが表示されるときにアイテムが追加されているのがわかります。

import {BindingEngine, inject} from 'aurelia-framework'; 

@inject(BindingEngine) 
export class GridControl { 

    @bindable items = []; 

    constructor(bindingEngine) { 
    this.items = []; 
    let subscription = bindingEngine.collectionObserver(this.items) 
            .subscribe(this.listChanged); 
    } 

    listChanged(splices) { 
    // do some stuff 
    } 
} 

しかし呼ばれることは決してありません私の「listChanged」ハンドラ: 私の問題は、私は「アイテムの配列がそのように私はこのようなコンポーネントにcollectionObserverを追加しようとしました変更されたときに、他のアクションを実行する必要があるということです。どんな考え?

+0

これは微妙なJSのスコープの問題である場合は疑問に思う:

はこのような何かをやってみてください。 ..それ以外は、それは私には大丈夫です。 Aureliaのどのバージョン? – Charleh

+0

私はシャルレが正しいと思います。私は私のAureliaアプリでそれをしなければならなかった。 –

+1

@Charleh、これはスコープの問題ではありませんでしたが、私が下の答えで述べたように、コンポーネントへの参照を保持するためにここで提案したようにコールバックを再調査しなければならなかった...とにかく感謝! – Gaet

答えて

3

コンストラクタでは、bindingEngine.collectionObserver(this.items)が呼び出されます。

後で、コンポーネントがデータバインドされている場合、this.itemsにはデータバインディングを介して別の配列インスタンスが割り当てられます。この異なる配列インスタンスは、あなたが観測のためにバインディングエンジンに渡したインスタンスではありません。 - ちょうど `.subscribeを試してみてください(=> this.listChanged(スプライス)をスプライス)`代わりに、それが動作するかどうかを確認

import {BindingEngine, inject} from 'aurelia-framework'; 

@inject(BindingEngine) 
export class GridControl { 
    @bindable items; 

    constructor(bindingEngine) { 
    this.bindingEngine = bindingEngine; 
    } 

    listChanged(splices) { 
    // do some stuff 
    } 

    subscribeItems() { 
    if (this.items) { 
     this.subscription = this.bindingEngine.collectionObserver(this.items) 
     .subscribe(splices => this.listChanged(splices)); 
    } 
    } 

    unsubscribeItems() { 
    if (this.subscription) { 
     this.subscription.dispose(); 
     this.subscription = null; 
    } 
    } 

    itemsChanged() { 
    this.unsubscribeItems(); 
    this.subscribeItems(); 
    } 

    unbind() { 
    this.unsubscribeItems(); 
    } 
} 
+0

私はそれが起こったとき、その1つを逃したと思う。 ちょうどある一定の種類の変更履歴が途中で来ていたら - ( –

+0

)itemsChanged()は完全に新しい配列が項目に割り当てられた場合ですか? –

+0

ありがとう私はこれを考えなかった...コンポーネントへの参照を保持するためにsubscribeメソッド(.subscribe(splice => this.listchanged(splice))でlistChangedにコールバックを再調査しなければならなかったあなたの解決策は金です。 – Gaet

関連する問題