0

我正在学习 flex/flash,但我迷路了。我在一堆视图中使用了“数据”,效果很好。由于某种原因,它在这里不起作用。

我在这里将一个字段设置为一个字符串:

function LoginLoaded (e:Event):void {
                    trace(e.target.data);
                    var ServerReturn:String;
                    ServerReturn = new String(e.target.data);
                    data.UserCommonReturnData = ServerReturn;
                    navigator.pushView(CommonPlaces, data);
                }

在公共场所视图中,我尝试将其加载回来:

var CommonPlacesData:String = new String();
            var CurrentSelect:String = new String();
            CommonPlacesData = new String(data.UserCommonReturnData);

这给出了错误“访问未定义的属性数据”我不明白,因为调用类似 data.PickUpTime (也是一个字符串)的东西在其他视图中工作正常。

数据从第一个视图开始,如下所示:

[Bindable] public var User:ObjectProxy = new ObjectProxy();

User.ID = "2314084";
navigator.pushView(TaxiNowOrLaterView, User);

然后在以后的视图中我这样调用它:(工作正常)

var PickUpString:String = new String(data.ID);

任何帮助都会很棒!谢谢!!!

4

1 回答 1

1

关于您的代码的内容很少。首先,您确实应该养成根据语言命名标识符的习惯。标识符以大写字母开头,随后对单词的其余逻辑部分使用小写字母(系统也称为 PascalCase),仅用于命名类。其余标识符应使用 camelCase(类似于 PascalCase,但首字母不大写)**。这大大减少了理解代码的工作量。经验丰富的 AS3 程序员会按如下方式解释您的代码:

// Static constant (!) ID of the class User is assigned (?) a value of "2314084"
User.ID = "2314084";
// invoke a method pushView of a local variable navigator with arguments
// of which first is the class TaxiNowOrLater, the second is the class User
navigator.pushView(TaxiNowOrLaterView, User);

虽然,也许,你不是故意的。

new String();

在 AS3 的上下文中根本没有任何意义。字符串永远不是引用,是不可变的,并且具有大多数程序员都同意的字面语法。上面的代码与"". 同理,new String(anotherString)效果完全一样anotherString

您的问题: event.target可能有很多不同的东西,其中一些可能具有称为“数据”的属性,而另一些可能没有。解决此问题的一般方法是您需要将event.currentTarget或的值event.target转换为您希望调度事件的类型。假设您期望来自一个Button类的实例的事件,那么:

private function clickHandler(event:MouseEvent):void {
    if (Button(event.currentTarget).enabled) // do things
}

如果同一个事件是由一个不是按钮的对象调度的,这不会保护您免受错误的影响,但会使错误报告更加有意识,因为它会告诉您它试图将哪个类转换为其他类,当它失败时。

如果你的程序逻辑要求处理程序知道它不应该处理的事件(为什么?)你可以这样写:

private function clickHandler(event:MouseEvent):void {
    var button:Button = event.currentTarget as Button;
    if (button && button.enabled) // do things
}

event.targetvs event.currentTarget- 很少你会需要event.target,大多数时候你需要currentTarget. 我不是说这是错误的,但是,看起来它可能是问题所在。target是作为事件的第一个原因的对象。事件可能会冒泡,这意味着它们可能会在显示列表层次结构中上下移动,首先从父级到子级,然后反向。在下面的示例中,假设按钮上有一个标签,一旦生成事件就会被单击 - 在这种情况下,即使您为按钮添加了侦听器,event.target也将是按钮标签,而不是按钮。currentTarget相反,它是将事件分派到处理程序的直接对象。

还有几件事:ObjectProxy是一个愚蠢的类,你可能不应该在任何情况下使用。它没有任何用处,而且可能有问题,但到目前为止,很少有人关心发现它的错误。简而言之,它的作用如下:它创建一个对象,该对象“监视”其属性的动态创建、分配和删除,并在这些事件发生时调度事件。这种行为容易出现很多错误和隐含的错误。例如,是否foo.bar = "baz"; foo.bar = "baz";重新分配相同的财产?是foo.bar.baz = "fizzbuzz";修改foo.bar吗?如果属性名称不是一个刺痛怎么办?等等。

为什么你不应该使用它:总是有更好的方法来处理你的数据。更透明、更容易调试、更高效。这个类是一个原型,它从未真正起作用。除了具有上述行为之外,就用于编写它的代码行而言,它是巨大的。调试其中发生的错误需要大量的时间和耐心,这当然不值得。

如果您需要一个对象来代表用户,请定义一个类,以及您希望用户拥有的属性并使用该类 - 这将使调试和理解您的代码更加容易。

[Bindable]元数据是邪恶的。我不能告诉你你应该避免它,因为它使用得太频繁了,但是,我会的。你应该尽可能地避免它。我还没有遇到过什么时候使用这个元数据是合理的。与原型类似,ObjectProxy它是为懒惰的程序员设计的,没有过多考虑性能或极端情况。这又是许多隐含错误的来源,通常很难发现,因为围绕此元生成的代码“吞下了”错误。此元的替代方案是addEventListener(...)带有自定义事件的纯代码。

不幸的是,很多教程都会使用这种代码来让你快速上手语言+框架......

** 此规则有一些例外:常量都是大写的,命名空间名称使用下划线分隔单词的逻辑部分,但绝不使用大写字母。

于 2012-07-06T14:57:21.147 回答