【问题标题】:Flash Builder. Create dynamic mxml package instance闪存生成器。创建动态mxml包实例
【发布时间】:2016-03-28 10:51:36
【问题描述】:

所以,我刚刚开始使用 Flash Builder。切中要害

我的应用包结构:

index.mxml (default) <s:application/>
  [main]
    signin.mxml <s:form/>
    dashboard.mxml <s:group/>
      [content]
        home.mxml
        data_a.mxml
        data_b.mxml
        post.mxml
        and-many-more-mxml-file.mxml
        etc.mxml

index.mxml 充当(类似)前端控制器。只会加载 main 包组件 (signin,dashboard)。

index.mxmlfx:script:

import main.signin;
import main.dashboard;

public var m_signin:main.signin = new signin();
public var m_dashboard:main.dashboard = new dashboard();

private function app_ready():void { //creationComplete
    //...service to check session...
    if(is_signed) {
        addElement(m_dashboard);
    } else {
        addElement(m_signin);
    }
}

成功。

我们假设用户已签名。然后从main/dashboard.mxml 我想从main.content.* 加载数组中定义的包。

main/dashboard.mxml fx:script:

protected var dashboard_content:Object = {};
protected var dashboard_content_list:Array = [
    ['home','Home Admin'],
    ['user_a','User Data A'],
    ['user_b','User Data B']
    //many more.
];
for (var i:int = 0; i < dashboard_content_list.length; i++) {
    var content_class:Class = Class(getDefinitionByName('main.content.'+dashboard_content_list[i][0]));
    var content_obj:Object = new content_class();
    dashboard_content[dashboard_content_list[i][0]] = content_obj; //for refference each component
}

dashboard_content_list 中的每个数组说明:

0: package suffix that i want to load (ex: `main.content.home`).
1: button label (for each content).

但循环仍然无法正常工作,总是ReferenceError: Error #1065

所以我想做的是: 加载main.content.* 包类并将其保存在Object 中的main/dashboard.mxml

我的一些参考(but still not working.): http://www.untoldentertainment.com/blog/2008/11/12/as3-tutorials-instantiate-a-class-dynamically/ http://blogs.adobe.com/cantrell/archives/2010/09/loading-classes-dynamically-in-actionscript-3.html http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getQualifiedSuperclassName() Instantiate a class from a string in ActionScript 3 Dynamically Creating Flex Components In ActionScript AS3: Cast Variable as Dynamic Type https://delfeld.wordpress.com/2009/04/21/object_from_class_name/ http://www.mikechambers.com/blog/2006/06/22/actionscript-3-get-a-class-reference-by-class-name/ http://www.rozengain.com/blog/2009/08/21/getdefinitionbyname-referenceerror-and-the-frame-metadata-tag/

回复@SameerJain

我试过了:

import main.content.*;

//inside creationComplete
var c:Class = getDefinitionByName('main.content.home') as Class; // throw: ReferenceError: Error #1065
var o:Object = new c();
trace(o);

那么,我试试:

var c:Class = getDefinitionByName(getQualifiedClassName('main.content.home')) as Class;
var o:Object = new c();
trace(c); // return [class String]
trace(o); // return '' (empty)
trace(main.content.home); // return [class home] <<< this what I want.


已解决

所以,@SameerJain 的回答引导我解决了我的问题

protected var dashboard_content_list:Array = [
    /*
    index-0: the class inself <<< this solved my problem!
    index-1: the label button
    */
    [main.content.home,'Home Admin'],
    [main.content.user_a,'User Data A'],
    [main.content.user_b,'User Data B']
    //many more.
];


抱歉我的英语不好:)
谢谢。

【问题讨论】:

  • 您尝试做的是使用 Flex 项目,并尝试使其像纯 actionscript 项目一样工作。这是行不通的,要么让它成为一个动作脚本项目,要么利用 Flex SDK 而不是试图绕过它。 Flex SDK 确实为您管理类的创建,或者让 sdk 管理 .mxml 的创建,或者如果您想成为使它们成为纯 .as 类的人。
  • 嗯,好的。有什么例子吗?

标签: actionscript-3 flash flash-builder


【解决方案1】:

Flex 不会从您的 import 语句中编译未使用的包。因此,请确保导入所有必需的包并将其设置为任何变量的类型,以便编译器知道我们将在某处使用该包/类。一个工作示例可能是

import main.content.*;

private var dashboardhome:home;
private var dashboarduser_b:user_a;
private var dashboarduser_a:user_a;

for (var i:int = 0; i < dashboard_content_list.length; i++) {
    var content_class:Class = getDefinitionByName('main.content.'+dashboard_content_list[i][0]) as Class;
    var content_obj:Object = new content_class();
    dashboard_content[dashboard_content_list[i][0]] = content_obj; 
}

【讨论】:

  • ok,我添加了import main.content.*,但content_class:class 仍然抛出ReferenceError: Error #1065
  • 您是否像我发布的那样初始化了这些类?尝试使用空白类,这样你就知道类没有错误。
  • 我为你做了回应,看看我的问题:)
  • 先生,您必须为类定义一个设置类型的变量,就像我在我的示例中发布的那样 private var dashboardhome:home;否则导入 main.content.home 失败
  • 所以,我必须将每个信号组件写在一个变量中..,嗯,让我试试。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2020-11-13
  • 2020-08-12
  • 2020-05-11
  • 2015-12-17
相关资源
最近更新 更多