RPNiemeyer剣道ノックアウトライブラリを使用しています。相互にインスタンス化する3つのビューモデルがあります-FranchiseDetailsViewModel
インスタンス化LanguageListViewModel
するインスタンス化LanguageDetailsViewModel
。最後のビューモデルは、その機能が親に依存しているLanguageDetailsViewModel
ため、親への参照が必要です。FranchiseDetailsViewModel
html:
<div data-viewId="languageList" >
<div id="languageList" data-bind="with: viewModel">
<div id="languageListGrid" data-bind="kendoGrid: { data: languageViewModels, columns: [
{
field: 'Language',
title: 'Language',
width: 50
}
],
scrollable: false, sortable: true, pageable: false }" style="height: 380px">
</div>
</div>
</div>
javascript
$(function () {
var FranchiseDetailsViewModel = function () {
var
self = this,
initialize = function () {
self.languagesInfoViewModel(new LanguageListViewModel(self));
var parentViewModel = ({ viewModel: self.languagesInfoViewModel });
var element = $('div[data-viewId="languageList"')[0];
ko.applyBindings(parentViewModel, element);
};
FranchiseDetailsViewModel.prototype.languagesInfoViewModel = ko.observable();
initialize();
};
var LanguageListViewModel = function (franchise) {
var
self = this,
initialize = function () {
var languageViewModel = new LanguageDetailsViewModel(franchise);
self.languageViewModels.push(languageViewModel);
};
LanguageListViewModel.prototype.languageViewModels = ko.observableArray([]);
initialize();
};
var LanguageDetailsViewModel = function (franchise) {
LanguageDetailsViewModel.prototype.Language = ko.observable("English");
LanguageDetailsViewModel.prototype.franchise = franchise;
};
var initialize = new FranchiseDetailsViewModel();
});
親ビューモデルへのこの参照により、グリッドがソースデータにバインドされているときに、ある種の無限ループが発生します。エラーが発生しMaximum call stack size exceeded
ました。グリッドのソースにバインドするときにエラーが剣道ノックアウトライブラリにあると思います。グリッドを削除すると、この行のdivにバインドするノックアウトにエラーがないためです。
ko.applyBindings(parentViewModel, element);
これがこのエラーの本当の理由であり、どうすればこれを修正できますか?親ビューモデルへの参照を削除できないため、ソースデータにバインドするときの剣道ノックアウトの動作を修正したいと考えています。実例の助けがあれば大歓迎です。ありがとう。
Niemeyerのコメントごとに更新:
にバインドされたいくつかのプロパティを持つdivがありますFranchiseDetailsViewModel
。これらのプロパティの1つは、チェックボックスを表します-名前を付けますisVisible
。プロパティがにバインドされた別のdivがありますLanguageDetailsViewModel
。これらのプロパティの一部は、のチェックボックスがオンになっている場合にのみ表示されFranchiseDetailsViewModel
ます。それはfranchise.isVisible
本当です。これが私がフランチャイズのリファレンスを必要とする理由です。
私はjavascriptにかなり慣れていないので、プロトタイププロパティを正しく使用していない可能性があります。キーワードを使用してビューモデルをインスタンス化してnew
いるときに、プロトタイプに割り当てると、ビューモデルが公開されてマークアップに表示されるため、バインドできることがわかりました。あなたの例から、this.myPropertyもプロパティを公開していることがわかります。私のシナリオに違いがあるかどうかはわかりません。
this.myData.parent = parent;
私は自分の問題の解決策として使用することにしました。フィードバックありがとうございます。