我在拉我的头发。
我有ZK网格然后在网格内有另一个网格。 两者都绑定到单独的视图模型。
将其视为社交网络墙。
外网格是一个呈现帖子的ViewModel。 然后,对于每个帖子,使用内部网格,该网格绑定到另一个ViewModel以呈现注释。
好的,问题是“无法处理setAttr无法调用方法'set'的null(TypeError)”
如何调试此错误。完全没有服务器端错误。顺便说一句代码工作正常,但我不时地开始得到这个错误。
我正在使用 ZK 6.5.1.1 最新版本。
注意:我知道没有代码就更难分析问题了。但是对我来说发布一部分工作或有用的代码片段并不是太简单。如果有人知道如何调试这个可怕的消息,我将不胜感激。 另外我看到其他类似的消息:无法挂载:无法调用null等的replaceWidget等。
由于
答案 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>
0.3。请参阅chrome的开发人员中的错误消息,然后单击源链接:
0.4。左键单击setAttr下的第一行以添加断点。
0.5。参考页面并再次单击“测试”按钮,我们可以看到右侧的“wgt”为空,wgt通常表示一个小部件(客户端的组件)。
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的响应值。
希望这有帮助
参考文献:
答案 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");