4 Stimmen

Wie kann ich einen DataProvider zur Aktualisierung auffordern?

Ich verwende ein Array, um einen DataProvider zu befüllen, die ich verwende, um eine Listenkomponente zu befüllen. Wie dies:

var myDataProvider = new DataProvider(this.myArray);
this['list'].dataProvider = myDataProvider;

Wenn Änderungen am Array vorgenommen werden, möchte ich dem DataProvider mitteilen, dass er diese Änderungen aktualisieren soll, damit sie in der Listenkomponente angezeigt werden. Es wäre schön, wenn es eine Möglichkeit, den DataProvider zu sagen, für Änderungen im Array zu hören und selbst zu aktualisieren, aber ich würde für einen Weg, um es manuell zu aktualisieren begleichen.

Ich kann den DataProvider durch einen neuen DataProvider ersetzen, aber dann verliert die Liste ihre Auswahl. Ich nehme an, ich könnte durch den DataProvider gehen und vergleichen und jeden Eintrag ändern, um es mit dem Array übereinstimmen, aber das scheint viel zu umständlich. Gibt es eine Möglichkeit, einen DataProvider zu sagen, zu aktualisieren, um ein Array übereinstimmen?

Edit: Ich suche nach einer Möglichkeit, dies in Flash zu tun, nicht in Flex.

5voto

jason Punkte 8848

Arrays sind in AS 3 nicht bindungsfähig; sie lösen selbst keine Datenbindungsereignisse aus.

Wenn Sie mit Flex arbeiten, können Sie Ihr Array in eine ArrayCollection que es bindungsfähig und manipulieren die ArrayCollection anstelle der Array sollte alles automatisch so funktionieren, wie Sie es sich wünschen.

In der Praxis bedeutet dies:

var myAC:ArrayCollection = new ArrayCollection(myArray);
var myDP = new DataProvider(myAC);

myAC[0] = 'changing the array!'; // will be reflected in the dataProvider

Besser noch, wenn Sie das DataProvider Instanz an eine Flex-Komponente zu übergeben, können Sie normalerweise (fast immer) einfach die ArrayCollection stattdessen. Aber Sie haben nicht genug Kontext gezeigt, um mir in diesem Punkt sicher zu sein.

Hier finden Sie einige nützliche Links:

Editar: Mein Fehler, ich bin tatsächlich davon ausgegangen, dass Sie Flex für das oben genannte verwenden.

Im einfachen alten AS3 ist das Prinzip dasselbe. Die Array versendet keine Ereignisse, sondern die DataProvider tut. Wenn Sie Ihre Änderungen vornehmen können an den dataProvider selbst dann sind Sie startklar.

Die AS3 DataProvider Klasse bietet eine Reihe von Methoden zur Datenmanipulation, wie addItem , removeItem , replaceItem , replaceItemAt , nur als Beispiel.

Es kommt also darauf an, welche Art von Änderungen Sie an der Quelldatei vornehmen müssen. In den meisten Fällen können Sie diese über die Option DataProvider .

0 Stimmen

Danke, aber ich bin ziemlich sicher, dass ArrayCollection eine Flex-Klasse ist. Gibt es eine Möglichkeit, diese Funktionalität in Flash zu bekommen?

0 Stimmen

Danke für die Bearbeitung. Ich habe das in Betracht gezogen, aber das Quell-Array wird in einer anderen Klasse erstellt, die es nur als Array verwendet. Es scheint ein wenig kluge, es neu zu schreiben, um einen DataProvider zu verwenden. Gibt es keine Möglichkeit, einfach den DataProvider zu sagen, sich neu zu konfigurieren, um das geänderte Array anzupassen?

0 Stimmen

Da Objekte per Referenz übergeben werden, können der DataProvider und die Klasse, die das Array erstellt, das Array nach Bedarf verwenden, ohne voneinander zu wissen. Es sollte keine Notwendigkeit bestehen, die andere Klasse zu ändern.

1voto

Mike Punkte 21

Ich habe die letzten 4 Stunden damit verbracht, herauszufinden, was die Verbindung zwischen einem Dataprovider und dem ursprünglichen Array ist. Ich habe herausgefunden, dass die Verwendung der GetItemAt-Methode auf der Datentabelle auch das Array aktualisiert, dass der Dataprovider der Datentabelle aus automatisch aktualisiert wird, wenn ich die GetItemAt-Methode verwende.

import fl.events.ListEvent;
import fl.data.DataProvider;

var arr = new Array();
arr.push ({Name:"Mike",Height:"6'4"});
arr.push ({Name:"Jackie",Height:"5'9"});
arr.push ({Name:"Mike",Height:"0'10"});

dg.addColumn("Name");
dg.addColumn("Height");
dg.dataProvider = new DataProvider(arr);
dg.addEventListener(ListEvent.ITEM_CLICK,updatename);

function updatename(e):void {
e.target.getItemAt(e.rowIndex)["Name"] = name_txt.text;
trace (arr[e.rowIndex]["Name"]);
}

Was mich ärgert, ist, dass ich die removeItemAt-Methode verwende, die die Zeile aus der Datentabelle entfernt, aber das Array nicht aktualisiert. Zu Beginn dieses Projekts hatte ich keine Ahnung, dass getItemAt das Array aktualisieren würde und deshalb habe ich 4 Stunden damit verbracht, herauszufinden, wie mein Code zweimal subtrahiert.

1voto

Mike Punkte 21

Wenn Sie das Array aktualisieren, wird auch die Datentabelle automatisch aktualisiert (zumindest bei Flash CS4).

import fl.events.ListEvent;
import fl.data.DataProvider;

var arr = new Array();
arr.push ({Name:"Mike",Height:"6'4"});
arr.push ({Name:"Jackie",Height:"5'9"});
arr.push ({Name:"Mike",Height:"0'10"});

dg.addColumn("Name");
dg.addColumn("Height");
dg.dataProvider = new DataProvider(arr);
dg.addEventListener(ListEvent.ITEM_CLICK,updatename);

function updatename(e):void {
    arr[e.rowIndex]["Name"] = "none";
}

Allerdings können Sie mit arr.splice keine Zeile aus dem Array entfernen und die Datentabelle automatisch aktualisieren lassen. Für Löschungen (splice) und Ergänzungen (push) müssen Sie das Array und die Datentabelle getrennt aktualisieren.

0voto

Sie können die Daten ändern und den Dataprovider erneut zuweisen

var myDataProvider = new DataProvider(this.myArray);
this['list'].dataProvider = myDataProvider;

myDataProvider.getItemAt(0)["Name"] = "Some change";
this['list'].dataProvider = myDataProvider;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X