<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="creationCompleteHandler()">
<mx:Script>
<![CDATA[
import flash.display.DisplayObject;
import mx.core.UIComponent;
import mx.controls.ComboBox; ComboBox;
protected function creationCompleteHandler():void
{
var components:Array = getComponentsFromXML(xml.component);
var i:int = 0;
var n:int = components.length;
for (i; i < n; i++)
{
panel.addChild(components[i] as DisplayObject);
}
}
/**
* Parses an XML string, returns array of new components.
*/
public function getComponentsFromXML(components:XMLList):Array
{
var result:Array = [];
var child:Object;
var component:UIComponent;
var type:String;
var clazz:Class;
var i:int = 0;
var n:int = components.length();
for (i; i < n; i++)
{
child = components[i];
type = child.@type;
try {
clazz = flash.utils.getDefinitionByName(type) as Class;
} catch (error:ReferenceError) {
traceImportError(type);
}
component = new clazz(); // dynamic
var properties:XMLList = child.elements();
var property:XML;
var name:String;
var value:Object;
// for each child node
for each (property in properties)
{
name = property.localName();
value = property.toString();
// create a more generic method to convert
// strings to numbers and whatnot
// this is a regular expression matching any digit
// check out rubular.com
if (/\d+/.test(value.toString()))
value = Number(value);
if (property.attribute("isStyle") == "true")
component.setStyle(name, value);
else
component[name] = value;
}
result.push(component);
}
return result;
}
protected function traceImportError(type:String):void
{
trace("Please include the class '" + type + "' in the swf.");
var names:Array = type.split(".");
var last:String = names[names.length - 1];
trace("import " + type + "; " + last + ";");
}
]]>
</mx:Script>
<!-- sample data -->
<mx:XML id="xml" source="components.xml" />
<!-- sample container -->
<mx:Panel id="panel" width="100%" height="100%"/>
</mx:Application>
2条答案
按热度按时间mqkwyuun1#
您可以在Flex中动态建立组件,如下所示:
示例数据
示例应用程序:
只要为XML定义了结构,就可以创建一个XMLUtil来通用地处理XML(例如,获取所有属性,或者将字符串转换为正确的类型),还可以创建一个ComponentManifest类来获取XML文件并将其转换为组件。
你还需要确保所有用XML定义的类都被导入到swf中,否则它会抛出那个错误。你可以这样做:
ComboBox
没有第二个
ComboBox
直接导入是不行的。这应该可以让你开始,根据需要填写它!
如果你想有更好的/高级的xml值解析,可以看看Rubular来摆弄Regular Expressions:)。
nfg76nw02#
以下是@viatropos解决方案的修改版:
示例数据:
这里显然有一个错误,在那里是用来结束标签。
我还在所有字符串值周围添加了引号,以便于识别。
样本(伪)方法:
createComponentsFromXML(xml.components)
我实现了到int的转换,确保我检查了属性应该是字符串还是int。
PS:我现在还没有安装Flex,所以你可能会发现一些需要纠正的错误。
在这种情况下,您可能希望XML如下所示:
因为我怀疑你能用 accordion 的一层嵌套做很多事情。
我将把函数的实现留给您。