0

我正在开发一个自定义绑定,它将获取现有值并将其插入到视图模型中。但是,我遇到了一个障碍,ko.bindingHandlers 中提供的元素似乎没有任何子元素。

这是 KnockoutJS 中的工作方式还是我遗漏了什么?

这是我的 HTML 标记:

<div data-bind="with: person, useInitValueFor: ['firstName', 'lastName']">
    <div data-bind="text: firstName">John</div>
    <div data-bind="text: lastName">Doe</div>
</div>

这是我的 JS 代码:

ko.bindingHandlers.useInitValueFor = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var $elem = $(element);
        var value = ko.utils.unwrapObservable(valueAccessor());
        var allBindings = allBindingsAccessor();

        for (var i = 0; i < value.length; i++) {
            var c = value[i];
            var e = $elem.children('[data-bind*="' + c + '"]:first');
            alert(e.length); // This gives me 0
            if (e.length > 0) {
                var a = e.attr('data-bind').split(',');
                for (var j = 0; j < a.length; j++) {
                    var b = a[j].split(':');

                    switch (b[0]) {
                        case 'text':
                            allBindings.with[c](b[1]);
                            alert(allBindings.with[c]());
                            break;
                    }
                }
            }
        }
    }
};

function personViewModel() {
    this.person = {
        firstName: ko.observable(),
        lastName: ko.observable()
    };
}

$(document).ready(function() {
    var vm = new personViewModel();
    ko.applyBindings(vm);
});

您也可以在 jsFiddle 上看到它:http: //jsfiddle.net/dzul1983/XjD3Y/1/

4

1 回答 1

0

绑定的 init 函数with复制元素的子元素以用作“模板”。该update部分将当前数据应用于该“模板”。

所以,当你的绑定代码运行时,你就在with绑定initupdate.

您的一种解决方案是在绑定之前列出您的with绑定。

于 2012-12-06T22:19:54.677 回答