Ștergerea/înlocuirea unui nod în E4X (AS3 - Flex)

Construiesc un control al listei/grila într-o aplicație Flex și o folosesc într-o aplicație web .NET . Pentru a face o scurtă poveste scurtă, primesc xml dintr-o webservice de obiecte serializate. Am o limită de pagină a câte lucruri pot fi pe o pagină. Am luat o grilă de date și l-am transformat într-o pagină, sortez între pagini și rezolvând unele filtre de bază.

În ceea ce privește paginarea, folosesc un Dicționar tastat pe pagină și stocarea XML-ului pentru acea pagină. În acest fel, ori de câte ori un utilizator revine la o pagină pe care am salvat-o în acest dicționar, pot să scot xml din memoria locală în loc să apăs pe webservice. Practic, am cache datele obținute de la fiecare apel la serviciul web pentru o pagină de date.

Există mai multe lucruri care îmi pot expira cache-ul. Filtrarea și sortarea sunt principalul motiv. Cu toate acestea, un utilizator poate să editeze un rând de date în grila prin deschiderea unui editor. Datele pe care le editează pot determina ștergerea datelor afișate în rând. Aș putea merge cu ușurință la webservice și a obține toată pagina de date, dar din moment ce dimensiunea paginii este setată la timpul de executare, am putea să mă uit la o cantitate mare de înregistrări pentru a fi recuperate.

Deci, permiteți-mi să ajung la inima problemei pe care o întâmpină. Pentru a preveni întoarcerea întregii pagini de date, fac un apel către serviciul web, solicitând înregistrarea complet actualizată (editorul se ocupă de salvarea datelor sale).

Deoarece folosesc obiecte personalizate, trebuie să le serializez pe serverul xml (acest lucru este tratat deja pentru alte porțiuni ale software-ului nostru). Toate datele sunt gestionate prin xml în e4x. Memoria cache din dicționar este stocată ca un XMLList.

Permiteți-mi să vă arăt codul meu ...

var idOfReplacee:String = this._WebService.GetSingleModelXml.lastResult.*[0].*[0][email protected];
var xmlToReplace:XMLList = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee);

if(xmlToReplace.length() > 0)
{
    delete (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]);
    this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];
}

Practic, primesc idul nodului pe care vreau să îl înlocuiesc. Apoi îl găsesc în proprietatea Data cache ( XMLList ). Mă asigur că există, deoarece filtrul de pe linia a doua returnează XMLList .

Problema pe care o am este cu linia de ștergere. Nu pot face acea linie să șterge acest nod din listă. Linia care urmează liniei de ștergere funcționează. Am adăugat nodul în listă.

Cum înlocuiesc sau șterg acest nod (adică nodul pe care îl găsesc din extrasul filtru din proprietatea .Data din cache) ???

Hopefully the underscores for all of my variables do not stay escaped when this is posted! otherwise this._ == this._

0
fr hi bn

4 răspunsuri

Nu văd imediat problema, așa că nu pot decât să mă ghicesc. Linia delete pe care o obțineți caută primul element la nivelul superior din lista care are un atribut "Id" cu o valoare egală cu idOfReplacee . Asigurați-vă că nu este nevoie să vă grăbiți mai adânc în structura xml pentru a găsi acel id de potrivire.

Încercați în schimb:

delete (this._DataPages[this._Options.PageIndex].Data..(@Id == idOfReplacee)[0]);

(Observați extra "." După Date ). Puteți depana mai ușor acest lucru prin stabilirea unui punct de desprindere pe a doua linie a codului pe care l-ați postat și vă asigurați că XMLList arată ca și cum vă așteptați.

0
adăugat

Poate că ați putea folosi replace ?

var oldNode : xml = this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0];
var newNode : xml = this._WebService.GetSingleModelXml.lastResult.*[0].*[0];    

oldNode.parent.replace(oldNode, newNode);
0
adăugat

Mulțumesc pentru tipii de răspunsuri.

@Theo: Am încercat să înlocuiesc câteva moduri diferite. Din anumite motive, nu ar fi niciodată o eroare, dar nu va actualiza niciodată lista.

@Matt: Mi-am dat seama de o soluție. Problema nu a venit din ceea ce ați sugerat, ci din modul în care ștergerea funcționează cu listele (cel puțin așa cum am în acest caz).

Proprietatea Date a obiectului dicționar _DataPages este lista nodurilor de definire (a fost obținută de o filtrare anterioară a unui alt document XML).


     
     

Am ajuns să fac această mică afacere:

//gets the index of the node to replace from the same filter
var childIndex:int = (this._DataPages[this._Options.PageIndex].Data.(@Id == idOfReplacee)[0]).childIndex();
//deletes the node from the list
delete this._DataPages[this._Options.PageIndex].Data[childIndex];
//appends the new node from the webservice to the list
this._DataPages[this._Options.PageIndex].Data += this._WebService.GetSingleModelXml.lastResult.*[0].*[0];

Deci, practic am avut de a obține indexul nodului în XMLList care este proprietatea Date. De acolo aș putea folosi cuvântul cheie de ștergere pentru al elimina din listă. + = Adaugă noul meu nod în listă.

Sunt atât de obișnuit să folosesc chestii ActiveX sau Mozilla XmlDocument unde chemați "SelectSingleNode" și apoi utilizați "replaceChild" pentru a face acest tip de lucruri. Ei bine, cel puțin acest lucru se întâmplă într-un forum pe care altcineva îl poate găsi. Nu știu procedura pentru ceea ce se întâmplă când îmi răspund propria întrebare. Poate că această înțelegere va ajuta pe altcineva să vină și să răspundă mai bine la întrebare!

0
adăugat

Știu că este o întrebare incredibil de veche, dar nu văd (ceea ce cred că este) cea mai simplă soluție la această problemă.

Theo a avut direcția corectă aici, dar există o serie de erori în ceea ce privește modul în care a fost înlocuit (și faptul că aproape totul în E4X este o funcție).

Cred că acest lucru va face truc:

oldNode.parent().replace(oldNode.childIndex(), newNode);

replace() can take a number of different types in the first parameter, but AFAIK, xml objects are not one of them.

0
adăugat