我正在尝试构建一个绑定,允许我根据viewmodel中的属性更改输入元素的类型,并将该输入元素的值绑定到我的viewmodel的另一个属性。
我有以下小提琴,展示了我想要完成的任务:fiddle
<div data-bind="dynamic: theType, value: 'theValue'"></div>
ko.bindingHandlers.dynamic = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var vm = valueAccessor();
var $element = $(element);
var choice = ko.unwrap(vm) || 'shortText';
var bindTo = allBindings.get('value');
if (choice === 'longText') {
$element.html("<textarea rows='4' data-bind='value: " + bindTo + "' valueUpdate: 'afterkeydown' />");
} else {
$element.html("<input type='text' data-bind='value: " + bindTo + "' valueUpdate: 'afterkeydown' />");
} // if
ko.applyBindings(viewModel, $element.find(':input')[0]);
}
};
var vm = {
theValue: ko.observable(''),
theType: ko.observable(''),
};
ko.applyBindings(vm);
不幸的是,我尝试的所有内容都会导致元素和视图模型之间的链接丢失,或者敲门声抱怨我无法多次将绑定应用于同一个元素。我知道我可以用模板做到这一点,但我想知道为什么我的方法不起作用。
有人有任何建议吗?
谢谢,
唐
答案 0 :(得分:1)
行。事实证明,我需要做的就是添加:
return { controlsDescendantBindings: true };
从我的init方法,淘汰赛,我可以相处得很好。请在此处查看更新的小提琴:http://jsfiddle.net/X4xXL/2/