ई 4 एक्स (एएस 3 - फ्लेक्स) में एक नोड को हटाना/बदलना

मैं एक फ्लेक्स एप्लिकेशन में एक सूची/ग्रिड नियंत्रण बना रहा हूं और इसे .NET वेब एप्लिकेशन में उपयोग कर रहा हूं। वास्तव में एक लंबी कहानी बनाने के लिए मुझे धारावाहिक वस्तुओं के एक webservice से एक्सएमएल मिल रहा है। मेरे पास पृष्ठ की सीमा है कि पेज पर कितनी चीजें हो सकती हैं। मैंने डेटा ग्रिड लिया है और इसे पेज बनाया है, पेजों में सॉर्ट किया है, और कुछ बुनियादी फ़िल्टरिंग को संभाला है।

पेजिंग के संबंध में मैं पृष्ठ पर कुंजीपटल एक शब्दकोश का उपयोग कर रहा हूं और उस पृष्ठ के लिए एक्सएमएल संग्रहीत कर रहा हूं। इस तरह जब भी कोई उपयोगकर्ता उस पृष्ठ पर वापस आ जाता है जिसे मैंने इस शब्दकोश में सहेजा है, तो मैं webservice को मारने के बजाय एक्सएमएल को स्थानीय मेमोरी से पकड़ सकता हूं। असल में, मैं प्रत्येक कॉल से डेटा के पृष्ठ के लिए webservice पर पुनर्प्राप्त डेटा कैशिंग कर रहा हूं।

ऐसी कई चीजें हैं जो मेरे कैश की समयसीमा समाप्त कर सकती हैं। फ़िल्टरिंग और सॉर्टिंग मुख्य कारण हैं। हालांकि, कोई उपयोगकर्ता एक संपादक खोलकर ग्रिड में डेटा की एक पंक्ति संपादित कर सकता है। वे जो डेटा संपादित करते हैं वह पंक्ति में प्रदर्शित डेटा को बाँधने का कारण बन सकता है। मैं आसानी से webservice पर जा सकता हूं और डेटा का पूरा पृष्ठ प्राप्त कर सकता हूं, लेकिन चूंकि पेज का आकार रनटाइम पर सेट होता है, इसलिए मैं पुनर्प्राप्ति के लिए बड़ी मात्रा में रिकॉर्ड्स देख सकता हूं।

तो अब मुझे उस मुद्दे के दिल में आने दो जो मैं अनुभव कर रहा हूं। डेटा के पूरे पृष्ठ को वापस पाने से रोकने के लिए मैं पूरी तरह से अपडेट किए गए रिकॉर्ड (संपादक अपने डेटा को सहेजने वाले हैंडल) के लिए पूछने वाले webservice पर कॉल करता हूं।

चूंकि मैं कस्टम ऑब्जेक्ट्स का उपयोग कर रहा हूं, इसलिए मुझे उन्हें सर्वर पर एक्सएमएल में क्रमबद्ध करने की आवश्यकता है (यह पहले से ही हमारे सॉफ़्टवेयर के अन्य हिस्सों के लिए संभाला जाता है)। सभी डेटा को एक्स 4 एक्स में एक्सएमएल के माध्यम से संभाला जाता है। शब्दकोश में कैश को XMLList के रूप में संग्रहीत किया जाता है।

अब मुझे अपना कोड दिखाएं ...

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

असल में, मुझे उस नोड की आईडी मिलती है जिसे मैं प्रतिस्थापित करना चाहता हूं। फिर मुझे इसे कैश की डेटा प्रॉपर्टी में मिलता है ( XMLList )। मैं सुनिश्चित करता हूं कि यह दूसरी पंक्ति पर फ़िल्टर XMLList लौटाता है।

मेरी समस्या है डिलीट लाइन के साथ है। मैं उस पंक्ति को उस नोड को सूची से हटा नहीं सकता। डिलीट लाइन के बाद की रेखा काम करता है। मैंने सूची में नोड जोड़ा है।

मैं उस नोड को कैसे प्रतिस्थापित या हटा सकता हूं (जिसका मतलब है कि नोड जो मुझे कैश की डेटा संपत्ति से फ़िल्टर स्टेटमेंट से मिलता है) ???

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

0
ro fr bn

4 उत्तर

मुझे तुरंत समस्या नहीं दिखाई देती है, इसलिए मैं केवल अनुमान लगा सकता हूं। आपको मिली हटाएं पंक्ति जो सूची के शीर्ष स्तर पर पहली आइटम की तलाश कर रही है जिसमें एक विशेषता "आईडी" है जो के बराबर मान के साथ है। idOfReplacee । यह सुनिश्चित करें कि मेल खाने वाली आईडी को खोजने के लिए आपको xml संरचना में गहरी खुदाई करने की आवश्यकता नहीं है।

इसके बजाए इसे आजमाएं:

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

( डेटा के बाद अतिरिक्त '।' पर ध्यान दें)। आप पोस्ट किए गए कोड की दूसरी पंक्ति पर ब्रेकपॉइंट सेट करके इसे आसानी से डीबग कर सकते हैं, और यह सुनिश्चित कर सकते हैं कि XMLList आपको अपेक्षा की तरह दिखता है।

0
जोड़ा

शायद आप प्रतिस्थापित करें का उपयोग कर सकते हैं?

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
जोड़ा

दोस्तों, जवाबों के लिए धन्यवाद।

@Theo: मैंने कई अलग-अलग तरीकों को बदलने की कोशिश की। किसी कारण से यह कभी भी त्रुटि नहीं करेगा, लेकिन सूची को कभी अपडेट नहीं करेगा।

@Matt: मैंने एक समाधान निकाला। यह मुद्दा आपके द्वारा सुझाए गए सुझावों से नहीं आ रहा था, लेकिन डिलीट कैसे सूचियों के साथ काम करता है (कम से कम इस उदाहरण में मुझे यह कैसे है)।

_DataPages शब्दकोश ऑब्जेक्ट की डेटा प्रॉपर्टी परिभाषा नोड्स की सूची है (किसी अन्य xml दस्तावेज़ के पिछले फ़िल्टरिंग द्वारा पहुंची थी)।


     
     

मैं यह छोटा सौदा कर रहा था:

//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];

तो मूल रूप से मुझे XMLList में नोड का अनुक्रमणिका प्राप्त करना था जो डेटा प्रॉपर्टी है। वहां से मैं सूची से इसे हटाने के लिए हटाए गए कीवर्ड का उपयोग कर सकता हूं। + = सूची में मेरा नया नोड जोड़ता है।

मैं ActiveX या Mozilla XmlDocument सामग्री का उपयोग करने के लिए इतना उपयोग करता हूं जहां आप "SelectSingleNode" कहते हैं और फिर इस तरह की सामग्री करने के लिए "replaceChild" का उपयोग करते हैं। ओह ठीक है, कम से कम यह कुछ मंच में है जहां कोई और इसे ढूंढ सकता है। जब मैं अपने प्रश्न का उत्तर देता हूं तो क्या होता है, इसके लिए मैं प्रक्रिया को नहीं जानता। शायद यह अंतर्दृष्टि किसी और के साथ आने में मदद करेगी और प्रश्न का बेहतर उत्तर देने में मदद करेगी!

0
जोड़ा

मुझे पता है कि यह एक अविश्वसनीय रूप से पुराना सवाल है, लेकिन मुझे नहीं लगता (मुझे क्या लगता है) इस समस्या का सबसे आसान समाधान है।

थियो के पास सही दिशा थी, लेकिन जिस तरह से प्रतिस्थापन का उपयोग किया जा रहा था, उसके साथ कई त्रुटियां हैं (और तथ्य यह है कि ई 4 एक्स में बहुत कुछ सब कुछ एक समारोह है)।

मेरा मानना ​​है कि यह चाल करेगा:

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
जोड़ा