2009-02-04 1 views
2

я следующий код ретранслятора:Удаление узлов XML из Flex-ретранслятора не работает?

<mx:Repeater id="chapterRepeater" dataProvider="{Library.Book.Chapter}"> 
    <mx:FormItem label="Chapter" direction="horizontal"> 
     <mx:TextInput width="100" text="{ [email protected]}" 
        change="event.currentTarget.getRepeaterItem()[email protected] = event.target.text"/> 
     <mx:NumericStepper maximum="2000" minimum="0" value="{[email protected]}" 
        change="event.currentTarget.getRepeaterItem()[email protected] = event.target.value"/> 
     <mx:Button label="x" width="20" click="delete event.currentTarget.getRepeaterItem()"/> 
    </mx:FormItem> 
</mx:Repeater> 

Действуя на следующий XML

<Library Name="TestLibrary1"> 
    <Book Name="TestBook1"> 
     <Chapter Name="TestChapter1" Words="530"/> 
     <Chapter Name="TestChapter2" Words="490"/> 
     <Chapter Name="TestChapter3" Words="1030"/> 
    </Book> 
</Library> 

Это позволяет пользователю редактировать имена и значение Главы объектов. Однако, по какой-то причине операция «удалить» не работает?

Может кто-нибудь посоветует мне, как ссылаться на предметы внутри ретранслятора, чтобы их удалить?

ответ

3

Хммм ... мне понадобилось какое-то время, чтобы хоть как-то решить какое-то решение. В событии click (а затем в событиях изменения в текстовой области и numericStepper) вы получаете доступ к currentTarget. CurrentTarget фактически вернет ссылку на кнопку. Поскольку это кнопка, а не ретранслятор, getRepeaterItem() ничего не вернет. Я действительно удивлен, что вызов getRepeatItem() не вызвал ошибку. Излишне говорить, что я не думаю, что они обновляли xml.

Мое решение экстернализирует FormItem в свой собственный компонент (так как при запуске клика я могу пузырить событие из FormItem. Таким образом, я всегда знаю, из какой формыItem произошло событие), а затем удаляет элемент через xmlListCollection.

Так у меня есть отдельный компонент, называемый ChapterFormItem.mxml, который содержит

<?xml version="1.0" encoding="utf-8"?> 
<mx:FormItem xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
      private var _chapterData : XML; 

      [Bindable] 
      public function get chapterData() : XML 
      { 
       return _chapterData; 
      } 

      public function set chapterData(value : XML) : void 
      { 
       _chapterData = value; 
      } 

      private function clickHandler(event : MouseEvent) : void 
      { 
       dispatchEvent(new Event("deleteChapter")); 
      } 

      private function textInputChangeHandler(event : Event) : void 
      { 
       [email protected] = textInput.text; 
      } 

      private function numericStepperChangeHandler(event : Event) : void 
      { 
       [email protected] = numericStepper.value; 
      } 
     ]]> 
    </mx:Script> 

    <mx:Metadata> 
     [Event(name="deleteChapter", type="flash.events.Event")] 
    </mx:Metadata> 

    <mx:TextInput id="textInput" width="100" text="{[email protected]}" change="textInputChangeHandler(event)"/> 
    <mx:NumericStepper id="numericStepper" maximum="2000" minimum="0" value="{[email protected]}" change="numericStepperChangeHandler(event)"/> 
    <mx:Button label="x" width="20" click="clickHandler(event)"/> 
</mx:FormItem> 

и в основном приложения XML (для этого примера) я есть

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.collections.XMLListCollection; 

     import mx.collections.ArrayCollection; 

     [Bindable] 
     private var xml:XML = <Library Name="TestLibrary1"> 
            <Book Name="TestBook1"> 
             <Chapter Name="TestChapter1" Words="530"/> 
             <Chapter Name="TestChapter2" Words="490"/> 
             <Chapter Name="TestChapter3" Words="1030"/> 
            </Book> 
           </Library>; 

     private function itemDeleteHandler(event : Event) : void 
     { 

      var chapterItem : ChapterFormItem = event.currentTarget as ChapterFormItem; 
      var chapterData : XML = chapterItem.chapterData; 


      var xmlListCollection : XMLListCollection = new XMLListCollection(xml.Book.Chapter); 
      var chapterDataIndex : int = xmlListCollection.getItemIndex(chapterData); 

      xmlListCollection.removeItemAt(chapterDataIndex); 
     } 

     ]]> 
    </mx:Script> 

    <mx:Form width="100%" height="100%"> 

     <mx:Repeater id="chapterRepeater" dataProvider="{xml.Book.Chapter}"> 
      <local:ChapterFormItem label="Chapter" 
           direction="horizontal" 
           chapterData="{chapterRepeater.currentItem}" 
           deleteChapter="itemDeleteHandler(event)" /> 
     </mx:Repeater> 

    </mx:Form> 

</mx:Application> 
+0

Кто бы мог подумать, что это будет так сложно. :-) – Ben

+0

согласился, ха-ха .... взял меня на время, чтобы понять, что один из них –