2

我最近将部分代码从 OL 3.3 移植到 OL 5.0。我认为一切都会正常,但是当我尝试使用 ant 脚本运行它时,我得到了这个错误。

 [echo] C:\Program Files\OpenLaszlo Server 5.0.x\Server\lps-5.0.x/WEB-INF/lps/server/bin/lzc.bat
 [exec] Compiling: C:\Workspace\application\client\src\TestClient.lzx to TestClient.swf10.swf
 [exec] compiler output is Loading configuration file C:\Program Files\OpenLaszlo Server 5.0.x\Server\lps-5.0.x\WEB-INF\frameworks\flex-config.xml
 [exec] C:\Documents and Settings\310773\Local Settings\Temp\lzswf9\Workspace\application\client\src\build\TestClient\app.swf (289808 bytes)

所以,我拿了这个文件夹,直接在 Laszlo 中编译了它。它没有显示任何错误,但是当 swf 即将加载主页时,我收到此错误。知道为什么吗?

TypeError: Error #1007: Instantiation attempted on a non-constructor.
    at $lzc$class__mvz/$mvx()
    at LzNode/__LZresolveReferences()
    at LzNode/__LZcallInit()
    at LzCanvas/__LZcallInit()
    at LzCanvas/__LZinstantiationDone()
    at LzInstantiatorService/makeSomeViews()
    at LzInstantiatorService/checkQ()
    at Function/http://adobe.com/AS3/2006/builtin::call()
    at LzEvent/sendEvent()
    at LzIdleKernel$/__update()
4

3 回答 3

2

这是您尝试实例化未定义的类时收到的错误消息。这是一个例子:

<canvas>

  <class name="myclass">
    <handler name="oninit">
      // Instantiate a class which is not defined
      var x = new lz.missingclass();
    </handler>
  </class>

  <myclass />

</canvas>

检查通过脚本实例化的类是否缺少 <includes>。您也可以随时查看Adob​​oe Flash 运行时错误列表,有时此处包含有用的信息。

编辑:添加问题的解决方案
此评论指出了问题:

我发现这条线导致了问题。<attribute name="dp" value="$once{new lz.Datapointer()}" />. 知道为什么吗?

如果您查看 5.0 的 OpenLaszlo 参考,您将看到类名(在类浏览器的左侧)使用不同的大小写;一些类使用驼峰式大小写(lz.Browser、lz.DataElement),其他类使用全部小写(lz.view、lz.datapointer)。在您的情况下,您应该使用 lz.datapointer 而不是 lz.Datapointer。

因此,此代码将毫无问题地编译和运行:

<canvas>

  <class name="my_class" extends="node">
      <attribute name="dp" value="$once{new lz.datapointer()}" />
  </class>

  <my_class oninit="Debug.inspect(this.dp)" />

</canvas>

测试类的正确名称的一个好方法是在 DHTML 运行时的控制台中使用 JavaScript,您可以在其中为 lz 自动完成。???类名:

在浏览器 JavaScript 控制台中自动完成 LZX 类名

在 OpenLaszlo 中调试 SWF #1007 错误
如果您在 SWF 运行时遇到 #1007 错误,我会在禁用调试器并打开 JavaScript 错误控制台的情况下为 DHTML 编译应用程序。尝试这个:

  1. 将带有 $once{} 约束的行更改为

    <attribute name="dp" value="$once{new lz.Datapointer()}" />

  2. 使用 DHTML 运行时和 debug=false 在 Chrome 中编译应用程序。您应该在 JavaScript 控制台中看到以下错误:

JavaScript 控制台中未定义类的错误

  1. 单击右侧的error-1007.lzx:3,您将看到生成的 JavaScript 代码,其中包含导致错误的行

OpenLaszlo 编译器生成的代码中的 JavaScript 错误

此行失败:

this.setAttribute("dp",new (lz.Datapointer)())

您甚至可以通过在控制台中输入new (lz.Datapointer)来重现错误。

于 2012-08-24T09:54:03.487 回答
2

就像一个信息点:类名的大小写在 4.0 中被“规范化”,因此实现标记的类的大小写与该标记相同。请参阅映射类和标记名称

于 2012-08-29T15:38:04.323 回答
0

这是问题的示例和解决方法:

1)问题:

这是演示该问题的简短 OpenLaszlo 应用程序的代码:

<canvas width="1000" height="584">

  <view name="myContainer" width="500" height="500">

    <handler name="oninit">
      var objCB = new lz.combobox(this);
    </handler>

  </view>


</canvas>

在此示例中,应用程序中没有 <combobox> 标记,因此编译器认为它不需要在应用程序中包含 OpenLaszlo <combobox> 类代码。因此,当我们尝试使用“var objCB = new lz.combobox(this);”行来实例化一个组合框时 编译器抛出以下错误:

错误@test1007error.lzx≈5:TypeError:错误#1007:在非构造函数上尝试实例化。

2)解决方法:

该问题的解决方案是在您的应用程序中为 <combobox> 添加一个包含:

<canvas width="1000" height="584">

  <include href="lz/combobox.lzx" />

  <view name="myContainer" width="500" height="500">

    <handler name="oninit">
      var objCB = new lz.combobox(this);
    </handler>

  </view>


</canvas>

这次没有抛出错误,当我们运行它时,我们看到组合框出现在应用程序的左上角。

于 2012-08-24T16:29:30.807 回答