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
です。