我有这个微调器。
设置好后,控件显示正确的值,没有错误信息,但如果我更改它,每次收到此错误信息时:
“TypeError:observable不是函数”
在这一行:
observable($(element).spinner("value"));
这是我的自定义绑定中的一行,如下所示:
ko.bindingHandlers.spinner = {
init: function (element, valueAccessor, allBindingsAccessor) {
//initialize datepicker with some optional options
var options = allBindingsAccessor().spinnerOptions || {};
$(element).spinner(options);
//handle the field changing
ko.utils.registerEventHandler(element, "spinchange", function () {
//var observable = valueAccessor();
var observable = ko.utils.unwrapObservable(valueAccessor());
observable($(element).spinner("value"));
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).spinner("destroy");
});
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
current = $(element).spinner("value");
if (value !== current) {
$(element).spinner("value", value);
}
}
};
如果我将失败的行与注释掉的那行交换:
var observable = valueAccessor();
它工作正常。 为什么第一个失败?
答案 0 :(得分:3)
在自定义绑定中,valueAccessor
是一个function
,它返回绑定的值,所以你在"右侧"在绑定中。
因此,在data-bind="spinner: yourValue
的情况下,您将获得yourValue
属性的内容。
如果您的yourValue
为ko.observable
,那么在var observable = valueAccessor();
中,observable
将包含您yourValue
var observable = valueAccessor();
observable($(element).spinner("value"));
的实际可观察功能现在可以将它设置为任何值:
ko.utils.unwrapObservable(valueAccessor());
因此,在这种情况下,这是正确的用法,因为您需要引用和使用您的可观察函数而不是它的值。
但是如果你使用valueAccessor()();
,它会自动解开你的observable,所以你会以一个值而不是一个函数结束。所以这个调用大致相当于写vm = {
yourValue: ko.observable(5);
}
因此,如果您的视图模型如下所示:
var observable = ko.utils.unwrapObservable(valueAccessor());
observable($(element).spinner("value"));
当你写:
observable
5
将包含值{{1}}而不是函数,因此您可以获得上述异常。