この種の問題のデバッグに関しては、以下のようなことを試すことができます:
.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>
.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>
.3. Chrome の開発者ツールでエラー メッセージを確認し、ソース リンクをクリックします。
.4. setAttr の下の最初の行を左クリックして、ブレークポイントを追加します。
.5. ページを参照して「テスト」ボタンをもう一度クリックすると、右側の「wgt」が null であることがわかります。wgt は通常、ウィジェット (クライアント側のコンポーネント) を示します。
.6. 今わかっているのは、ウィジェットが null になり、ZK がその setAttr コマンドを実行することです。これをデバッグするには、bind_ が呼び出されている間、すべての uuid と className をログに記録するだけです (bind_ はウィジェットのライフサイクルの関数であり、基本的にはウィジェットのすべての 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 ページで以下のログ メッセージが取得され、クライアント側でテキスト ボックス ウィジェットが null になることが通知されます。また、Chrome 開発者ツールのネットワークで応答値を確認することもできます。
お役に立てれば
参考文献:
ZK クライアント側プログラミング
デバッグモードを開く
zk.Widget の bind_