【问题标题】:Knockout checkbox - Push only checked values into array剔除复选框 - 仅将选中的值推送到数组中
【发布时间】:2018-10-07 01:24:31
【问题描述】:

我有这个动态填充的复选框控件

<!-- ko foreach: AllPens -->
<label>
    <input type="checkbox" data-bind="checked: IsChecked" />
    <span data-bind="text: name"></span>
</label>
<!-- /ko -->

假设可观察数组 GETs (AllPens)

{ code: "001" , name: "Parker"},
{ code: "002" , name: "Sheaffer"},
{ code: "003" , name: "Mont Blanc"}

我必须 POST 回一个已检查元素的数组 -

"Pens": [{
    "PenType": "001",
    "Order": false
}, {
    "PenType": "002",
    "Order": true
}]

我有一个粗略的想法来存储检查过的 Pen 的代码,如果在对象中检查过 - new Pen('001',true)

function Pen(type, checked) {
    var self = this;

    self.PenType = ko.observable(type);
    self.IsChecked = ko.observable(false);
}

如何将复选框值绑定到对象上的 Knockout observableArray?

如果我弄清楚以上内容,我相信以下内容应该可以工作。

self.Pens= ko.computed(function()
{
    var selectedPens = [];
    ko.utils.arrayForEach(self.Pen(), function (pen) {
        if(pen.IsChecked())
            selectedPens.push(pen);
    });
    return selectedPens;
});

我还在学习 KO。任何帮助表示赞赏:)

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    我设法让这个工作。

    我没有将键值对直接动态填充到 Self.AllPens(),而是创建了一个函数来将 Pen 列表加载到 Object 中

        function Pen(type,name,checked) {
            var self = this;
    
            self.PenType= ko.observable(type);
            self.Name = ko.observable(name);
            self.IsChecked = ko.observable(checked || false);            
        }
    

    然后循环检查下面的 IsChecked -

            self.Pens= ko.computed(function () {
                var selectedPens = [];
                ko.utils.arrayForEach(self.AllPens(), function (pen) {
                    if (pen.IsChecked()) {
                        selectedPens.push({
                            PenType: pen.penType,
                            Order: pen.IsChecked()
                        });
                    }
                });
                return selectedPens ;
            });
    

    【讨论】:

      【解决方案2】:

      你的代码应该是这样的

      self.checkedPens = function(pen) {
          var isChecked = pen.order === "true";
          if (pen.penType !== null && isChecked) {
              self.Pens.push({
                  PenType: pen.penType,
                  Order: isChecked
              });
          }
      };
      

      【讨论】:

      • 我应该使用$parent.chosenItems 来检查复选框是否被选中?
      • 我认为是的,但不确定首先尝试调试您的代码或尝试使用控制台检查您是否获得了正确的值而不是可以使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2016-03-19
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多