2017-02-06 5 views
3

ich eine benutzerdefinierte Datenraster Element wie folgt vereinfacht:Aurelia Beobachter nicht für Array Brennen

export class DataGrid { 

    @bindable data; 

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

es wie folgt instanziiert ist:

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

"Sensing neue Daten ..." und Das Array der Datensätze wird in der Konsole angezeigt, wenn das Datenraster angezeigt wird. Wenn ich jedoch einen Datensatz aus dem Array von Objekten lösche, wird die Funktion dataChanged() nicht ausgelöst.

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

ich "Löschen Element ..." in der Konsole aber nicht "Sensing neue Daten ...".

Irgendwelche Ideen, warum dataChanged() nicht feuert, wenn ich einen Rekord splice?

Antwort

3

Sie können ein Array für solche Mutationen nicht beobachten. Sie müssen stattdessen einen collectionObserver verwenden. Ihr dataChanged() würde jetzt nur ausgelöst, wenn Sie den data Wert überschreiben (dh data = [1, 2, 3], der es mit einem neuen Array überschreibt).


Beispiel, wie Sie mit den collectionObserver aus der BindingEngine Klasse, für Ihre usecase:

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

Ich vermute, das ist richtig, aber nicht in der Lage gewesen, um es noch zu arbeiten. Ich habe bereits 'static inject = [Element];'. Kann ich es 'statisch inject = [Element, BindingEngine] machen; Konstruktor (element, bindingEngine) {...} '? Oder ist das die Ursache meines Problems? Gibt es ein '@ inject' Dekorator-Äquivalent für' [Element] '? – LStarky

+0

Sie sind gleich. Sie können entweder 'static inject = [Element, BindingEngine];' oder '@inject (Element, BindingEngine)', aber definitiv nicht beides. Beide zusammen funktionieren nicht, also benutzen Sie entweder '@inject()' oder 'static inject = [];' Und dann im Konstruktor: 'constructor (element, bindingEngine)'. – Travo

+0

Das habe ich mir gedacht. Aber ... funktioniert immer noch nicht. Keine Fehlermeldungen ... und 'dataArrayChanged()' wird nicht ausgelöst. Wie kann ich debuggen? – LStarky

Verwandte Themen