原文 senocular.com
Frank翻译
第一次翻那么长的文章,累死了,有很多句子翻得不够理想,大家最好结合着原文看.有什么没翻好的地方产生了误导,本人不负责......
也许对与大多数as2.0的使用者来说,控制类的控制范围是比较大的问题之一.更明确的说,我指的是当对象不属于类里面的实例时,类中的方法对对象时间的控制.你可能认为那只要在类里面定义就可以存取类中实例的成员了.然而,未必属于对象的函数就属于类了.AS2.0类中的XML onLoad问题.这可能是人们使用2.0的XML时遇到的比较大的问题.这于xml并没有很大关系,但是和类中类似onLoad的反馈的事件控制有比较大的关系:
问题就在于,如果你是在类中定义的onLoad事件,onLoad脚本却未必能存取类中的属性.举例:
class XMLContentLoader { public var target_txt:TextField; private var _xml:XML; function XMLContentLoader(url:String, target:TextField){ target_txt = target; _xml = new XML(); _xml.ignoreWhite = true; _xml.onLoad = function(success){ if (success) target_txt.text = this.firstChild.toString(); } _xml.load(url); } } |
这里,这个XMLContentLoader类创建了实例来下载xml并且在根据target_txt的属性指向的文本展示它的首节点.问题出现了,这里的onLoad不能准确的读取target_txt的属性.为什么?原因是一旦你进入了onLoad方法,你就不在类的范围中了,而是在XML实例的范围中.在这个范围中,如果要存取target_txt,其实你是在XML实例中存取target_txt而不是在XMLContentLoader实例中.幸好我们还有不少方法可以解决这个问题.
方法一,使用本地的一个变量.如果你使用类创建事件控制函数(onLoad),那么这个函数就已经向那个方法中所有的已经定义的本地变量声明了.如果你分配了需要的属性注释给一个主方法中的变量,它会在返回无效的范围执行.
var txt = target_txt; _xml.onLoad = function(success){ if (success) txt.text = this.firstChild.toString(); } |
只能用于变量,对呼叫类的方法来说并不安全
方法二
在收到处理机的对象内定义变量.因为在onLoad内_xml实例在寻找自己的target_txt,而不是类实例的.你要做的就是复制这个变量,到_xml内,保持名字一样.然后,onLoad可以正确的处理这个变量了,现在,相反的一面就是,至少在XML对象中,你所使用的是非动态类了.那就是说你不能在技术上添加或读取没有在类中定义过的属性或方法了.不过你可以通过欺骗FLash的编译器通过相关数组的语法来定义你的属性.在这里就是target_txt.
_xml["target_txt"] = target_txt; _xml.onLoad = function(success){ if (success) { target_txt.text = this.firstChild.toString(); } } |
_xml["hostInstance"] = this; _xml.onLoad = function(success){ if (success){ this.hostInstance.target_txt.text = this.firstChild.toString(); } } |
private var _xml; |
var host = this; _xml.onLoad = function(success){ if (success){ host.target_txt.text = this.firstChild.toString(); } } |
import mx.utils.Delegate; var objectA:Object = {name: "object A"}; var objectB:Object = {name: "object B"}; function getName():String { return this.name; } objectB.getName = Delegate.create(objectA, getName); trace( objectB.getName() ); // traces "object A"; |
import mx.utils.Delegate; class XMLContentLoader { public var target_txt:TextField; private var _xml:XML; function XMLContentLoader(url:String, target:TextField){ target_txt = target; _xml = new XML(); _xml.ignoreWhite = true; _xml.onLoad = Delegate.create(this, onLoadEvent); _xml.load(url); } function onLoadEvent(success:Boolean):Void { if (success) target_txt.text = _xml.firstChild.toString(); } } |
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |