如何将XMLListCollection绑定到Model中?

时间:2012-03-24 07:55:32

标签: flex actionscript datagrid model mxml

当在DataGrid中更新XMLListCollection时,我希望它将XML(绑定它)添加到Model中。我该怎么做?或者,如果不可能,我将如何手动将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,因为向DataGrid添加2个或更多元素因为任何原因从未使用XML或XMLList(我尝试{variable},{variable.colors},{variable.colors.color},{variable.color所有可能性)。我认为我可以使用Model,但我将其更改为下面的XML,以便您可以使用toXMLString()查看输出。最后,我必须使用模型或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 :(得分:0)

以下是您的一些误解:

<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实际上是一个无用的类,不知道为什么它甚至存在。您可以指定XMLXMLList作为DataGrid的数据提供者。 Model是另一个无用的类,所以,可能你可以松开它并用dataGrid.dataProvider替换它,你需要引用DataGrid的内容。