Доступ к ошибке компиляции Flex AIR из неопределенного свойства - PullRequest
0 голосов
/ 06 сентября 2018

Работая с серией примеров Adobe AIR, я столкнулся с ошибкой компиляции с одним из них, который я поместил в следующий файл демонстрационного приложения

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
  xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
      import mx.events.MenuEvent;

      private static const MENU_DEMO:String = "Demo...";

      private function onMenuItemClick(evt:MenuEvent):void
      {
        switch(evt.label)
        {
          case MENU_DEMO:
            break;
        }
      }
    ]]>
  </mx:Script>

  <mx:VBox width="100%" height="100%" paddingBottom="5">
    <mx:MenuBar id="menuBar"
      width="100%"
      labelField="@label"
      itemClick="onMenuItemClick(event);">
      <mx:XMLList>
        <menuitem label="Error">
          <menuitem label="{MENU_DEMO}" />
        </menuitem>
      </mx:XMLList>
    </mx:MenuBar>
  </mx:VBox>
</mx:WindowedApplication>

, для которого файл дескриптора

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6">
  <id>ErrorDemo</id>
  <filename>ErrorDemo</filename>
  <name>Error Demo</name>
  <version>v0.1</version>
  <description>Demo undefined property error</description>
  <copyright></copyright>
  <initialWindow>
    <title>Error Demo</title>
    <content>ErrorDemo.swf</content>
    <systemChrome>standard</systemChrome>
    <transparent>false</transparent>
    <visible>true</visible>
  </initialWindow>
</application>

Компиляция выдает следующий вывод

C:\Projects\AIR\ErrorDemo>amxmlc ErrorDemo.mxml
Loading configuration file C:\Projects\flex_sdk_4.6\frameworks\air-config.xml
C:\Projects\AIR\ErrorDemo\ErrorDemo.mxml(28):  Error: Access of undefined property _ErrorDemo_XMLList1.

          <menuitem label="{MENU_DEMO}" />

Проблема, похоже, заключается в использовании статического const {MENU_DEMO}, связанного с атрибутом метки тега menuitem, поскольку замена его текстом не приводит к ошибке компиляции. В документации Adobe по использованию Flex 4.6 говорится, что статические константы могут использоваться в качестве источников привязки данных, но, возможно, не так, как они используются здесь. Кто-нибудь знает, в чем проблема с их использованием таким образом?

Для пояснения: замена связанной константной ссылки {MENU_DEMO} строковым литералом Demo... дает следующий ожидаемый результат. Но использование строкового литерала вместо ссылки связанной константы лишает смысла использование связанной константы. Который, кажется, вызывает ошибку, и в этом суть этого поста.

ErrorDemo expected output

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Я не использую Flex, но из некоторых исследований о вашей проблеме я заметил ...

(1)

Ваш код имеет:

<menuitem label="{MENU_DEMO}" />

Попробуйте установить это как:

<menuitem label text="{MENU_DEMO}" />

(2)

Кроме того, поскольку вы говорите, itemClick="onMenuItemClick(event);" не должно быть подкреплено:

import mx.events.ItemClickEvent;

* * тысяча двадцать-одна (3)

Каков ожидаемый результат, если ваш код скомпилирован правильно?

Я не могу (или не буду) тестировать любой код Flex, поэтому дайте мне знать, если это работает или ошибки ...

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
  xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
      import mx.events.MenuEvent;
      import mx.events.ItemClickEvent; //add this

      [Bindable]
      public var MENU_DEMO:String = "Demo...";

      public function onMenuItemClick(evt:MenuEvent):void //or try... (evt:MenuEvent = null):void
      {
        if (evt.label.text == MENU_DEMO) //untested
        {
          //do something here
          evt.label.text = "Changed...";
        }

      }

    ]]>
  </mx:Script>

  <mx:VBox width="100%" height="100%" paddingBottom="5">
    <mx:MenuBar id="menuBar"
      width="100%"
      labelField="@label"
      itemClick="onMenuItemClick(event);">
      <mx:XMLList xmlns="">
        <menuitem label="Error" />
        <menuitem label text="{MENU_DEMO}" />
        </menuitem>
      </mx:XMLList>
    </mx:MenuBar>
  </mx:VBox>
</mx:WindowedApplication>
0 голосов
/ 14 сентября 2018

Для всех, кто интересуется, как выглядит mxml-версия Flex 4, вот что я придумал, следуя совету @ ProgrammerDancuk, кто действительно должен получить кредит

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:mx="library://ns.adobe.com/flex/mx"
  xmlns:s="library://ns.adobe.com/flex/spark">
  <fx:Script>
    <![CDATA[
      import mx.events.MenuEvent;

      private static const MENU_DEMO:String = "Demo...";

      private function onMenuItemClick(evt:MenuEvent):void
      {
        switch(evt.label)
        {
          case MENU_DEMO:
            break;
        }
      }
    ]]>
  </fx:Script>

  <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    <fx:XMLList id="demoMenu">
      <menuitem label="Error">
        <menuitem label="{MENU_DEMO}" />
      </menuitem>
    </fx:XMLList>
    </fx:Declarations>

  <mx:VBox width="100%" height="100%" paddingBottom="5">
    <mx:MenuBar id="menuBar"
      width="100%"
      labelField="@label"
      itemClick="onMenuItemClick(event);">
      <mx:dataProvider>
        {demoMenu}
      </mx:dataProvider>
    </mx:MenuBar>
  </mx:VBox>
</s:WindowedApplication>
0 голосов
/ 06 сентября 2018

попробуйте добавить [Bindable] до private static const MENU_DEMO:String = "Demo...";, оно становится:

[Bindable]
private static const MENU_DEMO:String = "Demo...";
...