ZKOSS无法处理setAttr无法调用null的方法'set'(TypeError)

时间:2013-01-01 18:46:05

标签: javascript zk

我在拉我的头发。

我有ZK网格然后在网格内有另一个网格。 两者都绑定到单独的视图模型。

将其视为社交网络墙。

外网格是一个呈现帖子的ViewModel。 然后,对于每个帖子,使用内部网格,该网格绑定到另一个ViewModel以呈现注释。

好的,问题是“无法处理setAttr无法调用方法'set'的null(TypeError)”

如何调试此错误。完全没有服务器端错误。顺便说一句代码工作正常,但我不时地开始得到这个错误。

我正在使用 ZK 6.5.1.1 最新版本。

注意:我知道没有代码就更难分析问题了。但是对我来说发布一部分工作或有用的代码片段并不是太简单。如果有人知道如何调试这个可怕的消息,我将不胜感激。 另外我看到其他类似的消息:无法挂载:无法调用null等的replaceWidget等。

由于

4 个答案:

答案 0 :(得分:2)

关于调试此类问题,您可以尝试以下内容:

0.1。打开调试模式(参见参考资料)

<强> zk.xml内

<zk>
    <client-config>
        <debug-js>true</debug-js>
    </client-config>
    <library-property>
        <name>org.zkoss.web.classWebResource.cache</name>
        <value>false</value>
    </library-property>
</zk>

0.2。尝试重现这个问题,在这里我创建一个样本来通过手动取消绑定组件来重现类似的问题,如下所示(单击“测试”按钮以查看类似的错误)

<强> test.zul

<zk>
    <textbox id="tbx" />
    <button label="test">
        <attribute name="onClick"><![CDATA[
            String uuid = tbx.getUuid();
            Clients.evalJavaScript("zk.Widget.$('$tbx').unbind();");
            tbx.setValue("abc");
        ]]></attribute>
    </button>
</zk>

test.zul loaded

0.3。请参阅chrome的开发人员中的错误消息,然后单击源链接:

error message in chrome console

after click the source link

0.4。左键单击setAttr下的第一行以添加断点。

add breakpoint

0.5。参考页面并再次单击“测试”按钮,我们可以看到右侧的“wgt”为空,wgt通常表示一个小部件(客户端的组件)。

retry with breakpoint

0.6。现在我们所知道的是一个小部件变为null然后ZK执行它的setAttr命令,为了调试这个,我们可以简单地记录每个uuid和className而bind_被调用(bind_是widget的生命周期的函数,基本上是instanciate所有dom元素客户端编程的小部件),并在点击按钮时再次记录所有小部件。

如,

test.zul(已更新)

<zk>
    <script><![CDATA[
        var allUuids = [];
        zk.afterLoad("zul", function () {
            var _wgt = {};
            // override zk.Widget,
            // basically zk.Widget is the
            // root of all widget classes
            zk.override(zk.Widget.prototype, _wgt, {
                bind_: function (a, b, c) {
                    // call original function
                    _wgt.bind_.apply(this, arguments);

                    // each widget has a uuid and className
                    allUuids.push({uuid: this.uuid, ele: this.className});
                }
            });
        });
        function showAllUuids () {
            var info,
                wgt;
            for (var i = 0; i < allUuids.length; i++) {
                info = allUuids[i];
                // get widget by uuid
                wgt = zk.Widget.$('#'+info.uuid);
                // show the old className and current status
                // you can also try record some more information as needed
                // e.g., parent, previousSibling, sclass, etc
                zk.log(info.uuid + ' was ' + info.ele + ' now ' + (wgt? wgt.className : wgt));
            }
        }
    ]]></script>
    <textbox id="tbx" />
    <button label="test">
        <attribute name="onClick"><![CDATA[
            String uuid = tbx.getUuid();
            Clients.evalJavaScript("zk.Widget.$('$tbx').unbind();");
            tbx.setValue("abc");
            Clients.evalJavaScript("showAllUuids();");
        ]]></attribute>
    </button>
</zk>

0.7。现在,我们将在点击“测试”按钮后获取更新的zul页面下面的日志消息,并告诉我们客户端的文本框小部件becoms为null,您还可以检查网络中的chromes developer tooles的响应值。

message with updated test.zul

response value

希望这有帮助

参考文献:

ZK Client Side Programming

Open the debug mode

bind_ in zk.Widget

答案 1 :(得分:0)

此特定错误似乎是由于更新了已从ZK桌面分离/删除的组件。换句话说,在服务器端,您可以引用已缓存但不再附加到组件树的组件。当您尝试更新它时,ZK可能会尝试将其状态与客户端上相应的Widget同步。但是,由于它已分离,因此在客户端不再存在,因此在空小部件上调用setAttr会出现此错误。

答案 2 :(得分:0)

尽管已经提供了可能的最佳答案,但我想补充一下,我遇到了这个错误,调试后发现网格组件中存在hflex =“ min”。我将其更改为hflex =“ 1”,错误消失了。一次更新几个版本的zk版本后,此错误开始,因此我不确定此更改在​​哪个版本之间发生,但很难识别。希望简单地在代码库中搜索hflex =“ min”可以节省一些时间...对于垂直伸缩,我想也是如此。

答案 3 :(得分:-1)

当我们将某项设置为先前已经设置过的元素时,就会出现这种情况。

喜欢

OFCchart chart = new OFCchart;
chart.setJSONScript("somedata");

//----- Some other place setting to the same---


chart.setJSONScript("somedata");