Различное поведение между Flex mx: XMLList и fx: XMLList - PullRequest
2 голосов
/ 18 марта 2011

Наличие этого кода в проекте 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 Ответ

2 голосов
/ 18 марта 2011

Полагаю, вы компилируете свой проект в строгом режиме и используете 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), которую вы упомянули.Чтобы это исправить, вы должны объявить XMLList перед его контейнером (в примере это List) в блоке <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, если у вас не включена опция строгого режима компилятора.Просто объявите XMLList в блоке <fx:Declarations>, и он должен работать нормально.

...