我正在学习弹性/闪光,我迷失了这个。我在一堆视图中使用了“数据”,它运行正常。由于某种原因,它不在这里工作。
我在这里将字段设置为字符串:
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);
任何帮助都会很棒!!感谢!!!
答案 0 :(得分: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.target
vs 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(...)
代码。
不幸的是,很多教程都会使用这种代码让你快速启动语言+框架......
**此规则有一些例外:常量都是大写的,命名空间名称使用下划线来分隔单词的逻辑部分,但绝不使用大写字母。