4

我正在使用mathias bynen 的占位符代码,如果我像这样进行简单的自定义绑定,我想将它与淘汰赛一起使用:

ko.bindingHandlers.placeholder = {
    init: function (element) {
        $(element).placeholder();
    }
};

和html

<input placeholder = "Line 1" data-bind="placeholder: {}, value: addressLine1">

它可以工作,但我想将它们“合并”到一个自定义绑定中,以便像使用它一样使用它

<input placeholder = "First Name" data-bind="placeholderValue: firstName">

所以我尝试了这段代码:

ko.bindingHandlers.placeholderValue = {
    init: function (element, valueAccessor) {
        $(element).placeholder();
        ko.bindingHandlers.value.init(element, valueAccessor);
    },
    update: function (element, valueAccessor) {
        ko.bindingHandlers.value.update(element, valueAccessor);
    }
};

但它让我感到

Uncaught TypeError: undefined is not a function 

我还没有真正掌握 ko

4

1 回答 1

12

当您创建委托自定义绑定作为最佳实践时,您应该始终将 and 的所有参数传递给内部绑定,因为您永远无法知道内部绑定使用哪些参数:initupdate

ko.bindingHandlers.placeholderValue = {
    init: function (element, valueAccessor, allBindingsAccessor, 
                    viewModel, bindingContext) {
        $(element).placeholder();
        ko.bindingHandlers.value.init(element, valueAccessor, 
             allBindingsAccessor, viewModel, bindingContext);
    },
    update: function (element, valueAccessor, allBindingsAccessor, 
                     viewModel, bindingContext) {
        ko.bindingHandlers.value.update(element, valueAccessor, 
             allBindingsAccessor, viewModel, bindingContext);
    }
};

你得到了异常,因为init投标value使用了allBindingsAccessor参数,但是因为你没有传递它,所以它会引发异常。

于 2013-08-02T11:19:43.300 回答