Как связать XMLListCollection в модель? - PullRequest
0 голосов
/ 24 марта 2012

Когда XMLListCollection обновляется в DataGrid, я хочу, чтобы он добавил XML (связать его) в модель.Как бы я это сделал?Или, если это невозможно, как мне вручную добавить XML в модель?

Это грубый пример того, что я пытаюсь сделать.Добавление данных в DataGrid работает нормально;он просто не входит в модель при отправке в HTTPService.

<mx:Model id="model">
  <root><colors>{collection}</colors></root>
</mx:Model>
<mx:XMLListCollection id="collection" />

<mx:Label text="Input color:" />
<mx:TextInput id="color" />
<mx:Button label="Add Color" click="addColor();" />
<mx:DataGrid dataProvider="{collection}">
  <mx:columns>
    <mx:DataGridColumn dataField="color" headerText="Color" />
  </mx:columns>
</mx:DataGrid>
<mx:Button label="Submit" click="submit();" />

<mx:Script><![CDATA[
  // imports...

  public function addColor():void {
    var xml:XML = new XML(<color></color>);
    xml.color = color.text;
    collection.addItem(xml);
    Alert.show(collection.toXMLString()); // xml looks fine and shows up in datagrid
    // how to do something like this?
    // model.appendChild(xml); // doesn't work
  }

  public function submit():void {
    var serv:HTTPService = new HTTPService();
    // setup serv...
    serv.send(model); // server just gets "<colors></colors>"
  }
]]></mx:Script>

Спасибо!

РЕДАКТИРОВАТЬ:

Спасибо, ребята за ваши ответы!Это привело к моему решению.Мне пришлось использовать XMLListCollection, потому что добавление 2 или более элементов в DataGrid по какой-либо причине никогда не работало ни с XML, ни с XMLList (и я пробовал {variable}, {variable.colors}, {variable.colors.color}, {variable.color} и т. д. все возможности).Я думаю, что я могу использовать модель, но я изменил ее на XML ниже, чтобы вы могли видеть вывод с помощью toXMLString ().Наконец, я должен использовать Model или XML, потому что это всего лишь небольшой пример большого проекта (я показал это, добавив OtherData ниже).Еще раз спасибо.Вот рабочий пример:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

  <mx:XML id="data">
    <colors>
    </colors>
  </mx:XML>

  <mx:XMLListCollection id="collection" source="{data.color}" />

  <mx:XML id="model">
    <root>
      <otherData>{otherData.text}</otherData>
      <colors>{data}</colors>
    </root>
  </mx:XML>

  <mx:Label text="Input color:" />
  <mx:TextInput id="color" />
  <mx:Button label="Add Color" click="addColor();" />
  <mx:DataGrid dataProvider="{collection}">
    <mx:columns>
      <mx:DataGridColumn dataField="color" headerText="Color" />
    </mx:columns>
  </mx:DataGrid>
  <mx:Label text="Other data:" />
  <mx:TextInput id="otherData" />
  <mx:Button label="Submit" click="submit();" />

  <mx:Script><![CDATA[
    import mx.controls.*;

    public function addColor():void {
      var xml:XML = new XML(<color></color>);
      xml.color = color.text;
      collection.addItem(xml);
      Alert.show(collection.toXMLString()); // xml looks fine and shows up in datagrid
    }

    public function submit():void {
      Alert.show(model.toXMLString());
    }
  ]]></mx:Script>

</mx:Application>

1 Ответ

0 голосов
/ 25 марта 2012

Вот несколько вещей, которые неправильно поняли с вашей стороны:

<root><colors>{collection}</colors></root>

вы, вероятно, ожидаете, что это свяжет collection с дочерним узлом <colors/> узла, в то время как то, что он делает, это подстановка строки E4X,поэтому здесь не создается привязка.

var xml:XML = new XML(<color><value></value></color>);

действительно должно быть:

var xml:XML = <color><value/></color>;

XML имеет специальный литеральный синтаксис в AS3, то, что вы использовали для создания нового XML, уже является XML,по сути, вы сделали это дважды.Узлы, не имеющие текстового значения, нормализуются, чтобы быть короче, поэтому попытка записать их так, как вы это делаете, не даст никакого эффекта.

XMLListCollection на самом деле бесполезный класс, не знаю, почему он вообще существует.Вы можете указать XML или XMLList в качестве поставщика данных для DataGrid.Model - еще один бесполезный класс, поэтому, возможно, вы можете просто потерять его и заменить его на dataGrid.dataProvider, где вам нужно будет ссылаться на содержимое DataGrid.

...