动态绑定到knockout.js中的动态元素

时间:2014-03-12 15:01:38

标签: jquery knockout.js

我正在尝试构建一个绑定,允许我根据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);

不幸的是,我尝试的所有内容都会导致元素和视图模型之间的链接丢失,或者敲门声抱怨我无法多次将绑定应用于同一个元素。我知道我可以用模板做到这一点,但我想知道为什么我的方法不起作用。

有人有任何建议吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

行。事实证明,我需要做的就是添加:

return { controlsDescendantBindings: true };

从我的init方法,淘汰赛,我可以相处得很好。请在此处查看更新的小提琴:http://jsfiddle.net/X4xXL/2/