سؤال

في Flex، لدي مستند xml مثل ما يلي:

var xml:XML = <root><node>value1</node><node>value2</node><node>value3</node></root>

في وقت التشغيل، أريد إنشاء عنصر تحكم TextInput لكل عقدة ضمن الجذر، وربط القيم بالقيم الموجودة في XML.بقدر ما أستطيع أن أقول أنه لا يمكنني استخدام BindingUtils للربط بعقد e4x في وقت التشغيل (من فضلك أخبرني إذا كنت مخطئًا هنا!)، لذلك أحاول القيام بذلك يدويًا:

for each (var node:XML in xml.node)
{
    var textInput:TextInput = new TextInput();
    var handler:Function = function(event:Event):void 
    {
        node.setChildren(event.target.text);
    };
    textInput.text = node.text();
    textInput.addEventListener(Event.CHANGE, handler);
    this.addChild(pileHeightEditor);
}

مشكلتي هي أنه عندما يقوم المستخدم بتحرير أحد مدخلات النص، فإن العقدة التي يتم تعيينها لها هي دائمًا آخر عقدة تمت مواجهتها في حلقة for.أنا معتاد على هذا النمط من C#، حيث في كل مرة يتم إنشاء وظيفة مجهولة، يتم أخذ "لقطة" لقيم القيم المستخدمة، لذلك ستكون "العقدة" مختلفة في كل وظيفة معالج.

كيف يمكنني "أخذ لقطة" للقيمة الحالية للعقدة لاستخدامها في المعالج؟أم يجب أن أستخدم نمطًا مختلفًا في Flex؟

هل كانت مفيدة؟

المحلول

الإغلاق يلتقط فقط أ مرجع للمتغير وليس لقيمته الحالية.نظرًا لأن المتغيرات المحلية هي ذات نطاق وظيفي (وليست ذات نطاق كتلة)، فإن كل تكرار خلال الحلقة ينشئ إغلاقًا يلتقط مرجعًا لنفس المتغير.

يمكنك استخراج كود إنشاء TextInput في وظيفة منفصلة، ​​مما يمنحك نسخة متغيرة منفصلة لالتقاطها للإغلاق.شيء من هذا القبيل:

for each (var node:XML in xml.node)
{
    var textInput:TextInput = createTextInput(node);
    this.addChild(pileHeightEditor);
}
... 

private function createTextInput(node:XML) : TextInput {
    var textInput:TextInput = new TextInput();
    var handler:Function = function(event:Event):void 
    {
        node.setChildren(event.target.text);
    };
    textInput.text = node.text();
    textInput.addEventListener(Event.CHANGE, handler);
    return textInput;
}

نصائح أخرى

لسوء الحظ، تعمل عمليات إغلاق الوظائف بشكل غريب/سيئ في Actionscript.تحصل المتغيرات على "لقطة" فقط عندما تخرج عن النطاق.لسوء الحظ، المتغيرات ذات نطاق وظيفي، وليست ذات نطاق محظور.لذلك لا ينتهي الأمر بالعمل كما تريد.

يمكنك إنشاء قاموس للتعيين منه إدخال النص -> العقدة, ، أو يمكنك تخزين العقدة في ملف TextInput's خاصية البيانات.

أتمنى أن يعمل ما وصفته بشكل صحيح لأنه طريقة سهلة/قوية للتعبير عن ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top