1

毛を引っ張っています。

ZK グリッドがあり、グリッド内に別のグリッドがあります。どちらも別々のビュー モデルにバインドされています。

ソーシャル ネットワークの壁と考えてください。

Outer Grid は、投稿をレンダリングする ViewModel です。次に、投稿ごとに、コメントをレンダリングするために別の ViewModel にバインドされた内側のグリッドが使用されます。

さて、問題は「setAttrの処理に失敗しましたnullのメソッド「set」を呼び出せません(TypeError)」です

このエラーをデバッグする方法。サーバー側のエラーはまったくありません。ところで、コードは正常に動作しますが、時々このエラーが発生し始めます。

最新バージョンのZK 6.5.1.1を使用しています。

注: コードがないと問題の分析が難しくなることはわかっています。しかし、実用的または有用なコード スニペットの一部を投稿するのは簡単ではありません。誰かがこの恐ろしいメッセージをデバッグする方法を知っていれば幸いです。また、他のタイプの同様のメッセージも表示されます: マウントに失敗しました: null などの replaceWidget を呼び出せません。

ありがとう

4

4 に答える 4

2

この種の問題のデバッグに関しては、以下のようなことを試すことができます:

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

test.zul がロードされました

.3. Chrome の開発者ツールでエラー メッセージを確認し、ソース リンクをクリックします。

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 開発者ツールのネットワークで応答値を確認することもできます。

更新された test.zul を含むメッセージ

応答値

お役に立てれば

参考文献:

ZK クライアント側プログラミング

デバッグモードを開く

zk.Widget の bind_

于 2013-01-06T14:37:18.263 に答える
0

この特定のエラーは、ZK デスクトップから既に切り離されている/削除されているコンポーネントを更新したことが原因のようです。つまり、サーバー側では、キャッシュされているがコンポーネント ツリーに関連付けられていないコンポーネントへの参照があります。更新しようとすると、ZK はそのステータスをクライアント側の対応するウィジェットと同期しようとする場合があります。ただし、切り離されたため、クライアント側には存在しなくなったため、null ウィジェットで setAttr を呼び出すと、このエラーが発生します。

于 2013-01-02T02:30:55.087 に答える
0

可能な最良の答えはすでに提供されていますが、追加したかったのですが、このエラーが発生し、デバッグ後にグリッドコンポーネントに hflex="min" があることが判明しました。これを hflex="1" に変更すると、エラーはなくなりました。このエラーは、zk バージョンを一度にいくつかのバージョンを更新した後に発生したため、この変更がどのバージョンで発生したかはわかりませんが、特定するのは困難でした。コードベースで hflex="min" を検索するだけで時間を節約できることを願っています...垂直フレックスについても同じことが当てはまると思います。

于 2020-08-07T20:17:28.767 に答える