Flex mx:XMLList和fx:XMLList之间的不同行为

时间:2011-03-17 21:50:22

标签: flex mxml

在flex3项目中使用此代码(请注意第六项上的enabled属性):

    <mx:XMLList id="items">
            <menuitem label="file">
                <menuitem label="file.new" data="New"/>
                <menuitem label="file.saveAs" data="SaveAs"/>
                <menuitem label="file.open" data="Open"/>
                <menuitem label="file.close" data="Close"/>
            </menuitem>
            <menuitem label="business">
                <menuitem label="business.add" data="AddBusiness"/>
                <menuitem label="business.delete" enabled="{someproperty.selected}" data="DeleteBusiness"/>
            </menuitem>
            <menuitem label="help">
                <menuitem label="help.about" data="About" />
            </menuitem>
        </mx:XMLList>

但是fx:XMLList无法以这种方式处理绑定。此代码给出了编译错误:

        <fx:XMLList id="items">
            <menuitem label="file">
                <menuitem label="file.new" data="New"/>
                <menuitem label="file.saveAs" data="SaveAs"/>
                <menuitem label="file.open" data="Open"/>
                <menuitem label="file.close" data="Close"/>
            </menuitem>
            <menuitem label="business">
                <menuitem label="business.add" data="AddBusiness"/>
                <menuitem label="business.delete" enabled="{someproperty.selected}" data="DeleteBusiness"/>
            </menuitem>
            <menuitem label="help">
                <menuitem label="help.about" data="About" />
            </menuitem>
        </fx:XMLList>

1120:访问未定义的属性项。

1 个答案:

答案 0 :(得分:2)

我想你是在严格模式下编译你的项目,并且你正在使用 items XMLList作为dataProvider直接用于某个组件(至少这是我发现的唯一方法)重现问题),像这样:

<s:List>
    <s:dataProvider>
        <s:XMLListCollection>
            <fx:XMLList id="items">
                <menuitem label="file">
                    <menuitem label="file.new" data="New"/>
                    <menuitem label="file.saveAs" data="SaveAs"/>
                    <menuitem label="file.open" data="Open"/>
                    <menuitem label="file.close" data="Close"/>
                </menuitem>
                <menuitem label="business">
                    <menuitem label="business.add" data="AddBusiness"/>
                    <menuitem label="business.delete" enabled="{someproperty.selected}" data="DeleteBusiness"/>
                </menuitem>
                <menuitem label="help">
                    <menuitem label="help.about" data="About"/>
                </menuitem>
            </fx:XMLList>
        </s:XMLListCollection>
    </s:dataProvider>
</s:List>

这会再现您提到的相同错误(#1120)。为了解决这个问题,你必须在List块中的容器之前声明XMLList(在示例中它是<fx:Declarations>)。这样,您可以确保在创建容器之前存在 items 引用,这是编译期间严格模式验证的内容。

<fx:Declarations>
    <fx:XMLList id="items">
        <menuitem label="file">
            <menuitem label="file.new" data="New"/>
            <menuitem label="file.saveAs" data="SaveAs"/>
            <menuitem label="file.open" data="Open"/>
            <menuitem label="file.close" data="Close"/>
        </menuitem>
        <menuitem label="business">
            <menuitem label="business.add" data="AddBusiness"/>
            <menuitem label="business.delete" enabled="{someproperty.selected}" data="DeleteBusiness"/>
        </menuitem>
        <menuitem label="help">
            <menuitem label="help.about" data="About"/>
        </menuitem>
    </fx:XMLList>
</fx:Declarations>

<s:List>
    <s:dataProvider>
        <s:XMLListCollection source="{ items }"/>
    </s:dataProvider>
</s:List>

更新:如果您没有启用编译器的严格模式选项,这也会生成#1120错误。只需在<fx:Declarations>块中声明XMLList,它就可以正常工作。