动态嵌入源动态

由网友(起步向前走)分享简介:是它可以动态地嵌入源。而不是做这个[嵌入(来源='../../../../assets/levels/test.xml')]我大概可以做这样的事情变种SRC ='../../../../assets/levels/test.xml[嵌入(来源= SRC)解决方案 这是不可能的元数据注解中什么是动态的:/。也就是说,你...

是它可以动态地嵌入源。而不是做这个

  [嵌入(来源='../../../../assets/levels/test.xml')]
 

我大概可以做这样的事情

 变种SRC ='../../../../assets/levels/test.xml
[嵌入(来源= SRC)
 

解决方案

这是不可能的元数据注解中什么是动态的:/。也就是说,你不能将变量引入元数据注解。如果这是可能的,就不会有那么多酷的可能性。所以,你的第一个选择是直接嵌入XML的唯一途径。

源无影加入中秋活动,在它之后就该轮到这些源武器了

您可以,但是,写一个自定义元数据分析器想通了如何加载(未嵌入)XML文件。是这样的:

  [的LoadFile]
公共变种来源:字符串=../../../../assets/levels/test.xml;
 

我会实现,像下面的code(刚才写的,现在,没有测试过)。然后你会过程,通过一些类如 MyMetadataUtil.process(本)。很多方法可以做到这一点。

 公共职能extractMetadata(目标:对象):无效
{
    Var描述:XML = flash.utils.describeType(目标);
    var标记:字符串=的LoadFile
    VAR元数据:返回XMLList = description.accessor.metadata(@名==标签)。
    元数据+ = description.variable.metadata(@名==标签)。
    变种我:= 0;
    变种N:INT = metadata.length();
    //通常被称为'指令'
    //拥有的元数据标注值
    VAR令牌:对象= {};
    对(我;我n种;我++)
    {
        metadataXML =元[I]
        token.property = metadataXML.parent()@名。
        // token.source = myClass.source;
        token.source =目标[token.property]
        VAR要求:的URLRequest =新的URLRequest(token.source);
        VAR装载机:的URLLoader =新的URLLoader();
        loader.addEventListener(引发Event.COMPLETE,loader_completeHandler);
        loader.addEventListener(IOErrorEvent.IO_ERROR,loader_ioErrorHandler);
        loader.load(要求);
    }
}

保护功能loader_completeHandler(事件:事件):无效
{
    event.currentTarget.removeEventListener(Event.type访问,loader_completeHandler);
    跟踪(成功加载的文件!);
}

保护功能loader_ioErrorHandler(事件:事件):无效
{
    event.currentTarget.removeEventListener(Event.type访问,loader_ioErrorHandler);
}
 

这东西会进入一些UTIL /经理/处理器类。然后在任何地方你code,你可以这样做:

  [的LoadFile]
公共变种来源:字符串=myfile.xml中;
 

这可能是动态的。请查看 Swiz框架关于如何实现自定义元数据处理器的一些实例源$ C ​​$ C。甚至更好, Openflux的MetaUtil 。一旦您设置了一次,就可以做一些铁杆的东西在你的code。使得编码的乐趣和快速的。

希望帮助, 兰斯

is it possible to embed sources dynamically. instead of doing this

[Embed(source = '../../../../assets/levels/test.xml')]

I could probably do something like this

var src = '../../../../assets/levels/test.xml'
[Embed(source = src )]

解决方案

It's not possible for anything within metadata annotations to be dynamic :/. That is, you can't place variables into metadata annotations. If that was possible, there would be SO many cool possibilities. So your first option is the only way to directly embed xml.

You could, however, write a custom metadata parser that figured out how to load (not embed) your xml file. Something like:

[LoadFile]
public var source:String = "../../../../assets/levels/test.xml";

I would implement that like the code below (just wrote this right now, haven't tested it). And then you'd "process" your class via something like MyMetadataUtil.process(this). Lots of ways to do that.

public function extractMetadata(target:Object):void
{
    var description:XML = flash.utils.describeType(target);
    var tag:String = "LoadFile"
    var metadata:XMLList = description.accessor.metadata.(@name == tag);
    metadata += description.variable.metadata.(@name == tag);
    var i:int = 0;
    var n:int = metadata.length();
    // usually called a 'directive'
    // holds values from metadata annotation
    var token:Object = {};
    for (i; i < n; i++)
    {
        metadataXML = metadata[i];
        token.property = metadataXML.parent().@name;
        // token.source = myClass.source;
        token.source = target[token.property];
        var request:URLRequest = new URLRequest(token.source);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loader_completeHandler);
        loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioErrorHandler);
        loader.load(request);
    }
}

protected function loader_completeHandler(event:Event):void
{
    event.currentTarget.removeEventListener(event.type, loader_completeHandler);
    trace("SUCCESSFULLY LOADED FILE!");
}

protected function loader_ioErrorHandler(event:Event):void
{
    event.currentTarget.removeEventListener(event.type, loader_ioErrorHandler);
}

That stuff would go into some util/manager/processor class. Then anywhere in your code, you could use this:

[LoadFile]
public var source:String = "myFile.xml";

And that could be dynamic. Check out the Swiz Framework for some example source code on how to implement custom metadata processors. Or even better, Openflux's MetaUtil. Once you set that up once, you can do some hardcore stuff in your code. Makes coding fun and fast.

Hope that helps, Lance

阅读全文

相关推荐

最新文章