2

KnockoutJS2.2.1に基づいて作成しているjQueryグリッドプラグインがあります。これまでのところ順調に進んでいますが、プラグインが要素で初期化されると、「computed」loadGridメソッドが3回呼び出されます。

ほんの少しの文脈のために、私はloadGridメソッドと他のいくつかの関連コードを含めています。(実際のプラグインはかなり大きいので、簡潔にするために、プラグインの一部のみを含めています)

function GridDataModel() {
    var self = this;

    self.gridState = {
        currentPage: ko.observable(opts.gridState.currentPage),
        pageSize: ko.observable(opts.gridState.pageSize),
        totalPages: ko.observable(opts.gridState.totalPages),
        orderBy: ko.observable(opts.gridState.orderBy),
    };
    self.loadGrid = ko.computed({
        read: function () {
            console.log('load grid');
            if (opts.dataUrl != '') {
                var requestData = self.gridState;
                if (self.columns.length == 0) requestData.needColumns = true;
                $.getJSON(opts.dataUrl, requestData, function (data, textStatus, jqXHR) {
                    self.loadData(data);
                });
            }
        },
        owner: this,
        deferEvaluation: false
    });
}

gridDataModel = new GridDataModel();

ko.applyBindings(gridDataModel);

これが計算した唯一の依存関係は、私の知る限り変更されていないself.gridStateにあることに注意してください。

初期化がロードを3回呼び出す原因を特定する必要があります。loadGridが定義されたときに呼び出されることは知っていますが(b / c deferEvaluation == false)、他の2つのイベントが発生する原因を突き止める必要があります。

それで質問のために...どのイベントが計算されたものを再評価させるのかを追跡する方法は何ですか?

別のメモでは、私は設定deferEvaluation : trueしましたが、発行すると

gridDataModel.gridState.currentPage.valueHasMutated()

計算されたものは起動しません。したがって、計算を機能させる唯一の方法は、の場合deferEvaluation == falseです。

4

2 に答える 2

0

[ソース] タブの Chrome 開発者ツールが役立つ場合があります。さまざまな DOM 要素にブレークポイントを設定できる右側のパネルを確認してください。

詳細については、このスクリプト パネルの概要(現在は「ソース」パネルと呼ばれています)、またはDOM イベントでのブレークポイントの作成に関するこの概要を参照してください。

于 2013-02-15T20:32:37.917 に答える
0

ノックアウト js クローム プラグインを使用し、KO のメッセージを使用して、コンソールに表示できるようにします。私が過去に行ったことの例。

self.messages.push(response.msg);
于 2015-09-21T14:57:41.577 に答える