2017-02-06 7 views
3

のために発射ません:それは、次のようにインスタンス化されますアウレリアの観察者が、私はこのように単純化したカスタムデータグリッド要素持って配列

export class DataGrid { 

    @bindable data; 

    dataChanged(newValue, oldValue) { 
    console.log("Sensing new data...", newValue); 
    } 
} 

を:

<data-grid data.bind="records"></data-grid> 

「新しいデータをセンシング...」とデータグリッドが表示されると、レコードの配列がコンソールに表示されます。ただし、オブジェクトの配列からレコードを削除すると、dataChanged()関数はトリガされません。

let index = this.records.findIndex((r) => { return r.acc_id === this.record.acc_id; }); 
if (index > -1) { 
    console.log("Deleting element..." + index, this.records); 
    this.records.splice(index, 1); 
} 

は私が"削除要素..." コンソールでなく"センシング新しいデータ..."を取得します。

dataChanged()がレコードをスプライシングするときに何の発想がないのですか?

答えて

3

このような変異のアレイは観察できません。代わりにcollectionObserverを使用する必要があります。現在、dataChanged()は、dataの値を上書きすると(つまり、data = [1, 2, 3]は新しい配列で上書きされます)、起動します。


どのようにあなたのユースケースのために、BindingEngineクラスからcollectionObserverを使用する例:私はこれを推測している

import { BindingEngine } from 'aurelia-framework'; 

export class DataGrid { 
    static inject = [BindingEngine]; 

    @bindable data; 

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

    attached() { 
    this._dataObserveSubscription = this._bindingEngine 
     .collectionObserver(this.data) 
     .subscribe(splices => this.dataArrayChanged(splices)); 
    } 

    detached() { 
    // clean up this observer when the associated view is removed 
    this._dataObserveSubscription.dispose(); 
    } 


    dataArrayChanged(splices) { 
    console.log('Array mutated', splices); 
    } 
} 
+0

は正しいですが、それはまだ仕事を得ることができませんでした。私はすでに 'static inject = [Element];'を持っています。それを 'static inject = [Element、BindingEngine];にすることはできますか?コンストラクタ(element、bindingEngine){...} '?それとも私の問題の原因ですか? '[要素]'に相当する '@ inject'デコレータはありますか? – LStarky

+0

彼らは等しいです。 'static inject = [Element、BindingEngine];または' @inject(Element、BindingEngine) 'のどちらかを実行できますが、必ず両方を行うことはできません。どちらもうまく動作しないので、 '@inject()'または 'static inject = [];'のどちらかを使い、コンストラクタで 'constructor(element、bindingEngine)'を使います。 – Travo

+0

それは私が考えたものです。しかし...まだ動作していません。エラーメッセージは表示されず、 'dataArrayChanged()'はトリガーされません。どうすればデバッグできますか? – LStarky

関連する問題