访问未定义的属性数据flex

时间:2012-07-05 18:00:52

标签: actionscript-3 flash flex flash-builder mxml

我正在学习弹性/闪光,我迷失了这个。我在一堆视图中使用了“数据”,它运行正常。由于某种原因,它不在这里工作。

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

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);

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

1 个答案:

答案 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.currentTargetevent.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(...)代码。

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

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