将代码从OpenLaszlo 3.3迁移到5.0:TypeError#1007尝试对非构造函数进行实例化。

时间:2012-08-24 08:29:58

标签: migration openlaszlo lzx

我最近将代码的一些部分从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()

3 个答案:

答案 0 :(得分:2)

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

<canvas>

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

  <myclass />

</canvas>

检查是否缺少&lt; includes&gt;通过脚本实例化的类。您也可以随时查看Adoboe Flash Run-Time Errors列表,有时此处包含有用的信息。

修改:添加问题的解决方案
这个意见指出了这个问题:

  

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

如果检查5.0的OpenLaszlo参考,您将看到类名(在类浏览器的左侧)使用不同的大小写;一些类使用camel case(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。类名:

Auto-completion for LZX class names in the browser JavaScript console

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

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

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

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

  3. Error for undefined class in JavaScript console

    1. 点击 error-1007.lzx:3 的右侧,您将看到生成的JavaScript代码,其中包含导致错误的行
    2. JavaScript error in code generated by the OpenLaszlo compiler

      此行失败:

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

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

答案 1 :(得分:2)

就像信息一样:类名的情况在4.0中是“正规化的”,因此实现标记的类的情况与该标记相同。请参阅Mapping Class and Tag Names

答案 2 :(得分: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>

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

  

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

2)解决方法:

问题的解决方案是在您的应用程序中为&lt; combobox&gt;添加一个包含:

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

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