Flex AIR 编译错误访问未定义属性

Posted

技术标签:

【中文标题】Flex AIR 编译错误访问未定义属性【英文标题】:Flex AIR compile error access of undefined property 【发布时间】:2019-02-11 13:49:51 【问题描述】:

在处理一系列 Adob​​e 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   paddingBottom="5">
    <mx:MenuBar id="menuBar"
      
      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" />

问题似乎归结于使用绑定到 menuitem 标签的 label 属性的静态 const MENU_DEMO,因为用文本替换它不会导致编译错误。 Adobe 的 Using Flex 4.6 文档指出静态常量可以用作数据绑定源,但可能不是这里使用的方式。有谁知道以这种方式使用它们有什么问题?

澄清一下:用字符串文字 Demo... 替换绑定常量引用 MENU_DEMO 会产生以下预期输出。但是使用字符串文字代替绑定常量引用违背了使用绑定常量的目的。这似乎是产生错误的原因,也是这篇文章的重点。

【问题讨论】:

只是建议,请使用最新的 Adob​​e AIR 将您的 SDK 更新到 Apache Flex 4.16,它有很好的安装程序 flex.apache.org 【参考方案1】:

尝试在private static const MENU_DEMO:String = "Demo..."; 之前添加[Bindable] 它变成:

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

【讨论】:

添加 [Bindable] 会产生来自编译器的 Error: [Bindable] not allowed on const member variables. 响应,即使在将 SDK 更新到 Apache Flex 4.16.1 之后也是如此 您是否已将代码转换为 Flex 4?我的意思是使用 @minipc 如果您将其设为const 并改用var,它会起作用吗?试试:private static var MENU_DEMO:String = "Demo..."; @VC.One 将 var 替换为 const,无论有无 [Bindable] 限定符对生成的错误消息没有影响。 @ProgrammerDancuk 您的 Bindable 建议无效。但是您的 Flex 4 转换建议(经过一番反复试验后,我才知道该怎么做)确实奏效了。因此,如果您编辑答案以包含它,我会接受它:)【参考方案2】:

我不使用 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   paddingBottom="5">
    <mx:MenuBar id="menuBar"
      
      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>

【讨论】:

已更新原始帖子以包含预期输出,并弄清楚如何将代码转换为 Flex 4,结果证明这是解决方案。【参考方案3】:

对于任何对 Flex 4 版本的 mxml 代码外观感兴趣的人,这是我根据 @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   paddingBottom="5">
    <mx:MenuBar id="menuBar"
      
      labelField="@label"
      itemClick="onMenuItemClick(event);">
      <mx:dataProvider>
        demoMenu
      </mx:dataProvider>
    </mx:MenuBar>
  </mx:VBox>
</s:WindowedApplication>

【讨论】:

以上是关于Flex AIR 编译错误访问未定义属性的主要内容,如果未能解决你的问题,请参考以下文章

JS 编译时 React DOM 更新。但是刷新浏览器会给出错误'无法读取未定义的属性(读取'1')'

1120:访问未定义的属性_stop

WebAssembly 编译器错误:使用外部库编译时未定义符号

VueJS:编译器错误状态数据属性在通过此属性访问时不存在

TypeScript 编译器崩溃:publicMembers 为 null 或未定义

Npm 编译器:无法读取未定义的属性“startsWith”