我正在尝试基于模板绑定编写自定义绑定。想法是拥有自己的视图模型类的模板,但我不想将该类的实例添加到父视图模型(至少不在代码中。在执行时添加实例对我来说是可以的)。
要了解我在这里要实现的目标是示例:我想构建高级滑块,我不希望滑块的 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);