繁体   English   中英

绑定处理程序“值不是函数”

[英]Binding handler 'value is not a function' knockoutJS

我对此问题感到困惑,因为此绑定处理程序通常可以正常工作(如下)

ko.bindingHandlers.buttonGroupChecked = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    var value = valueAccessor();
    var newValueAccessor = function() {
        return {
            click: function() {
                value(allBindingsAccessor.get('val'));
            }
        };
    };
    ko.bindingHandlers.event.init(element, newValueAccessor,
            allBindingsAccessor, viewModel, bindingContext);
},
update: function(element, valueAccessor, allBindingsAccessor,
        viewModel, bindingContext) {
    if (allBindingsAccessor.get("val") === ko.unwrap(valueAccessor())) {
        helpers.activeClassSingle(element, "btn-info", "btn-success");
    }


}
};

我在第7行value(allBindingsAccessor.get('val'));不断收到错误value(allBindingsAccessor.get('val')); 说值不是函数吗?

这些选项在我的视图模型中定义如下:

self.yesNoOptions = [
    {val: 1, text: "Yes"},
    {val: 0, text: "No"}
];

相应的HTML和绑定是:-

<div class="btn-group btn-group-justified" data-bind="foreach: $root.yesNoOptions">
               <div class="btn btn-lg btn-info" data-bind="buttonGroupChecked: $root.currentVariation().variationAgreed, val: val, text: text"></div>
            </div>

其中$root.currentVariation().variationAgreed是当前选定的一项,作为以下对象的一部分可观察到。

var observableWorkItemVariation = function(data){
var self = this;
data = data || {};
self.id = ko.observable(data.id || "");
self.orderWorkItemID = ko.observable(data.orderWorkItemID || "");
self.variationAgreed = ko.observable(data.variationAgreed || 0);
self.changeWorkBillable = ko.observable(data.changeWorkBillable || 1);
self.declareBillable = ko.observable(data.declareBillable || 0);

self.changeWorkBillable.subscribe(function(val){
   if(self.changeWorkBillable() == 0){
       self.declareBillable(0);
   } 
});

self.changeWorkPayable = ko.observable(data.changeWorkPayable || 1);
self.variationCode = ko.observable(data.variationCode || "");
}

它正确地突出显示了所选项(默认为0,否),但是当我尝试更改它时会引发错误。

click甚至触发时, value似乎超出范围。

目前,您正在一个函数的本地范围内定义value ,然后稍后尝试在另一个函数的本地范围内访问它。

我建议直接在每个div上使用click绑定。 淘汰赛将自动为您传递一个被单击的ViewModel实例,因此您可以在$ root视图模型的单击处理程序内部使用该实例来确定单击了哪个按钮以使其处于活动状态。

谢谢您的建议,罗伊(Roy)发表了有用的评论。

问题是我正在从另一个对象创建一个对象,并以varName而不是varName()的形式传递变量以获取值(或ko.toJS(object)),因此它将observable传递为可观察的。

我很难发现这一点,就好像您在<pre>标记中的viewModel上执行ko.toJS()一样,它会展开并显示正确的值。

希望对遇到此问题的任何人也很清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM