0

我很困惑是什么导致了这里的问题,因为这个绑定处理程序通常工作正常(下)

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'));说值不是函数?

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

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>

Where$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)但是当我尝试更改它时会引发错误。

4

2 回答 2

1

当偶数被触发时,它看起来value超出了范围。click

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

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

于 2015-12-08T19:25:06.263 回答
0

感谢您的建议,罗伊给出了有用的评论。

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

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

希望任何遇到此问题的人都清楚这一点。

于 2015-12-12T10:50:21.827 回答