【问题标题】:Checked attribute for checkbox list in knockout剔除中复选框列表的选中属性
【发布时间】:2016-07-27 05:01:23
【问题描述】:

我有两个数组应该显示并显示为复选框列表。 主要思想是单击第一个列表的元素以将元素添加到第二个列表。 html代码是这样的

   <div class="tab-pane" id="ColumnHeading">
             <div class="row">
                 <div class="form-group span4">
                     <h4>Column Headings</h4>
                     <ul class="icons-ul" data-bind="foreach: staticItem.ColumnHeadingList.ColumnHeadingListItem" >
                         <li>
                             <div class="span2">
                                 <input class="selectedHeading" type="checkbox" data-bind=" click: $parent.myCheck, checkedInArray: $parent.Params.Item.ColumnHeadingList.ColumnHeadingListItem, attr: { value: Value }" />
                                 <span data-bind="text: Name"></span>
                             </div>
                         </li>
                     </ul>
                 </div>
                 <div class="form-group span4" style="margin-left: -90px; margin-top: 15px">
                     <div class="icons-ul" data-bind="foreach: Params.Item.ColumnHeadingList.ColumnHeadingListItem" >
                             <div class="span4">
                                 <input  type="checkbox" data-bind="customcheck: IntOnly" />

                             </div>
                     </div>
                 </div>
                 <div class="span6">
                     <p class="validationMessage" data-bind="validationMessage: Params.Item.ColumnHeadingList.ColumnHeadingListItem"></p>
                 </div>
             </div>

值“IntOnly”是两个复选框列表中每个对象的属性。

我在第一个复选框列表上的单击事件的函数如下所示

  self.myCheck = (function(e) {
                    var index = self.staticItem.ColumnHeadingList.ColumnHeadingListItem().map(function(e) { return e.Value(); }).indexOf(this.Value());

                    if (self.staticItem.ColumnHeadingList.ColumnHeadingListItem()[index].IntOnly() !== "Y") {
                        self.staticItem.ColumnHeadingList.ColumnHeadingListItem()[index].IntOnly("Y");
                        var o = self.staticItem.ColumnHeadingList.ColumnHeadingListItem()[index];
                        var flag = false;
                        for (i = 0; i < self.Params.Item.ColumnHeadingList.ColumnHeadingListItem().length; i++) {

                            if (this.Value() == self.Params.Item.ColumnHeadingList.ColumnHeadingListItem()[i].Value()) {
                                flag = true;
                            }
                        }
                        if (flag == false || self.Params.Item.ColumnHeadingList.ColumnHeadingListItem().length == 0) {
                            var newObject = jQuery.extend(true, {}, this);
                            self.Params.Item.ColumnHeadingList.ColumnHeadingListItem.push(newObject);

                        }
                    } else { //checked==true

                        self.staticItem.ColumnHeadingList.ColumnHeadingListItem()[index].IntOnly("N");
                        for (i = 0; i < self.Params.Item.ColumnHeadingList.ColumnHeadingListItem().length; i++) {

                            if (this.Value() == self.Params.Item.ColumnHeadingList.ColumnHeadingListItem()[i].Value()) {
                                self.Params.Item.ColumnHeadingList.ColumnHeadingListItem.splice(i, 1);
                            }
                        }
                    }
                    return true;

                });

代码工作正常,可以将元素添加到第二个列表并将值保存在 IntOnly 因为 customcheck 函数检查 IntOnly 的值是否为“Y”以选择复选框,但我可以为第一个列表保存该属性,即使当正在获取该值并在表单发送到服务器后选中这些复选框并查看它们进行编辑。

请给点建议,对语法感到抱歉。

【问题讨论】:

  • 我不太清楚想要的结果应该是什么?有一个静态的项目列表,它们都有一个复选框。如果选中一个项目,它会出现在另一个列表中,并带有另一个复选框?第二个复选框有什么用?一般建议:当您使用checked 数据绑定时,您不需要clickattr: { value: .. } 数据绑定。
  • 基本上我在图像上第一个有一个静态列表,该列表上的每个元素都有属性 intOpt 当我单击其中一个对象时,该对象的属性应该更改为“y”和选中的应该是真的,并且对象应该被添加到第二个列表中。工作正常,但我不知道如何使用选中的敲除来检查第二个列表中的复选框并且具有“Y”中的属性。

标签: javascript checkbox knockout.js data-binding checked


【解决方案1】:

我做了一个非常简单的例子,一个复选框列表构建另一个。我认为您在这里想要的关键是 subscribe 到选中的变量,这样您就可以在其值更改时(选中或未选中时)采取行动。

我的函数只检查值是真还是假,pushes 或 removes 是第二个列表的列表元素。方便的是,我可以对两个列表使用相同的数据项;我只是将复选框绑定到不同的成员变量,因此第二个列表复选框独立于第一个列表中的相应复选框。

let vm = {
  list1: [1, 2, 3].map((n) => {
    const result = {
      label: `op${n}`,
      intOnly: ko.observable(false),
      anotherCheckValue: ko.observable(false)
    };

    result.intOnly.subscribe((isChecked) => {
      if (isChecked) {
        vm.list2.push(result);
      } else {
        vm.list2.remove(result);
      }
    });

    return result;
  }),
  list2: ko.observableArray()
};

ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div data-bind="foreach:list1">
  <label>
    <input type="checkbox" data-bind="checked: intOnly" />
    <span data-bind="text: label"></span>
  </label>
</div>
<div data-bind="foreach:list2">
  <label>
    <input type="checkbox" data-bind="checked: anotherCheckValue" />
    <span data-bind="text: label"></span>
  </label>
</div>

【讨论】:

  • 感谢您的回答,它有助于我了解如何分离两个列表之间的依赖关系,我的问题是我正在使用 Spring Framework 接收从 XML 中检索 viewModel 的值和我无法更改已保存的属性,
  • 你可以做任何你需要做的事情来构建第二个列表。我只是选择了最简单的东西来做一个例子。重要的一点是你想在subscribed 函数中做任何事情。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多