テンプレートバインディングに基づいてカスタムバインディングを作成しようとしています。アイデアは、独自のビューモデルクラスを持つテンプレートを持つことですが、そのクラスのインスタンスを親ビューモデルに追加したくありません(少なくともコードではありません。実行時にインスタンスを追加しても問題ありません)。
ここで達成しようとしていることを理解するには、例を示します。高度なスライダーを作成したい、スライダーのhtmlをテンプレートに入れたくない、スライダーは独自のクラスである必要があるが、スライダーのビューモデルインスタンスを追加したくない親ビューモデルに。これが私のコードです。最初は機能し、最初はテンプレートをレンダリングしているように見えますが、例外がスローされ、理由がわかりません。ここで作業コードを表示
html:
<script type="text/html" id="my-template">
<div data-bind="text: internalValue"></div>
</script>
<div data-bind="templateWithModel: {name: 'my-template', dataPropName: 'price', modelConstructor: Slider}">
</div>
js:
ko.bindingHandlers.templateWithModel = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext){
var options = ko.utils.unwrapObservable(valueAccessor());
var modelName = options.name + "_" + options.dataPropName;
viewModel[modelName] = new options.modelConstructor(viewModel[options.dataPropName]);
ko.bindingHandlers.template.init(element, valueAccessor);
},
'update': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var options = ko.utils.unwrapObservable(valueAccessor());
var modelName = options.name + "_" + options.dataPropName;
options.data = viewModel[modelName];
ko.bindingHandlers.template.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
}
var Slider = function(obsVal){
var self = this;
self.internalValue = ko.observable(obsVal());
}
var vm = {price: ko.observable(5)};
ko.applyBindings(vm);