1

我正在拉扯我的头发。

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

将其视为社交网络墙。

Outer Grid 是一个渲染帖子的 ViewModel。然后对于每个帖子,使用一个内部网格,该网格绑定到另一个 ViewModel 以呈现评论。

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

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

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

注意:我知道没有代码会更难分析问题。但对我来说,发布一部分工作或有用的代码片段并不是一件容易的事。因此,如果有人知道如何调试这条可怕的消息,我将不胜感激。我还看到其他类型的类似消息:挂载失败:无法调用 null 等的 replaceWidget 等。

谢谢

4

4 回答 4

2

关于调试此类问题,您可以尝试以下操作:

.1。打开调试模式(参见 ref)

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>

.2. 尝试重现此问题,这里我创建了一个示例,通过手动取消绑定组件来重现类似问题,如下所示(单击“测试”按钮查看类似错误)

测试.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

.3. 查看 chrome 的开发人员工具中的错误消息,然后单击源链接:

chrome 控制台中的错误消息

点击源链接后

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

添加断点

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

断点重试

.6. 现在我们知道一个widget变为null,然后ZK执行它的setAttr命令,为了调试它,我们可以简单地在调用bind_时记录每个uuid和className(bind_是widget生命周期的函数,基本上实例化了所有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>

.7. 现在我们将在单击“测试”按钮后收到下面带有更新的 zul 页面的日志消息,并让我们知道客户端的文本框小部件变为空,您还可以在 chrome 开发者工具网络中检查响应值。

带有更新的 test.zul 的消息

响应值

希望这可以帮助

参考 :

ZK 客户端编程

打开调试模式

zk.Widget 中的 bind_

于 2013-01-06T14:37:18.263 回答
0

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

于 2013-01-02T02:30:55.087 回答
0

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

于 2020-08-07T20:17:28.767 回答
-1

当我们将某些内容设置为之前已经设置的元素时,它就会出现。

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

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


chart.setJSONScript("somedata");
于 2018-07-25T12:41:26.283 回答