【问题标题】:Check "Select all" checkbox onload using Knockout使用 Knockout 选中“全选”复选框
【发布时间】:2017-04-08 20:18:38
【问题描述】:

我有一组复选框和一个全选复选框,使用 Knockout 按以下方式实现。我需要在页面加载时默认选中“全选”复选框。

$(document).ready(function(){
    viewModel=new model(ko,$);
    ko.applyBindings(viewModel);
});

function model(ko,$){
     var jsonResponse= $.parseJSON(response);

     this.factors=ko.observableArray(jsonResponse["factors"]);
    this.selectedFactors=ko.observableArray();

     this.selectAll = ko.dependentObservable({
        read: function() {
            return this.selectedFactors().length === this.factors().length;
        },
        write: function(newValue) {
            this.selectedFactors(this.selectedFactors().length === this.factors().length ? [] : this.factors().slice(0));
        },
        owner: this 
    });

}

HTML:

<table>
    <tr>
        <td><input type="checkbox" id="selectAll" data-bind="checked: selectAll" />Select All</td>
   </tr>
</table>
<table data-bind="foreach: factorsSplitJsonArray">
    <tr data-bind="foreach: $data">
        <td>
            <!-- ko if: $data.hasOwnProperty("factorCode") -->
            <input type="checkbox" class="jqFactors" id="jqFactors" data-bind="checkedValue: $data, checked: $root.selectedFactors" /> 
            <span data-bind="text: factorDescription"></span> 
            <!-- /ko -->
        </td>
    </tr>
</table>

当我选择或取消选择任何复选框或 SelectAll 复选框时,observableArray 即 selectedFactors 会发生变化。现在我需要在页面加载时默认选中“全选”复选框,并且 selectedFactors 也应该包含所有选定的因素。

我是 Knockout 的新手,无法了解如何使用 Knockout 实现此功能。如果我们以某种方式显式调用函数 selectAll,它会完成这项工作吗?如何调用 ko.dependentObservable 函数。谁能帮帮我。

【问题讨论】:

    标签: checkbox knockout.js selectall


    【解决方案1】:

    这里有一些不同的方法来达到同样的目的:

    var jsonData = {
      allFactors: [
        { code: "A1", desc: "Alpha one" },
        { code: "A2", desc: "Alpha two" },
        { code: "B1", desc: "Beta one" },
      ],
      
      // Simulate that no selection was ever made
      selectedFactors: null // or "undefined"
      
      // Unomment this version instead if you want to simulate loading
      // data that was previously selected:
      //selectedFactors: ["A1", "B1"]
    };
    
    function ViewModel(data){
      var self = this;
      
      self.factors = ko.observableArray(data.allFactors);
        
      function getAllCodes() {
        return data.allFactors.map(function(f) { return f.code; });
      }
      
      self.selectedFactors = ko.observableArray(
        data.selectedFactors || getAllCodes()
      );
      
      self.selectAll = ko.computed({
        read: function() {
          return self.selectedFactors().length === self.factors().length;
        },
        write: function(newVal) {
          if (newVal === self.selectAll()) return;     
          if (!!newVal) self.selectedFactors(getAllCodes());
          if (!newVal) self.selectedFactors([]);
        }
      });
    }
    
    ko.applyBindings(new ViewModel(jsonData));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    
    <label><input type="checkbox" data-bind="checked: selectAll"> Select All</label>
    <hr>
    <ul data-bind="foreach: factors">
      <li>
        <label>
          <input type="checkbox" data-bind="checkedValue: code, checked: $root.selectedFactors">
          <span data-bind="text: desc"></span>
        </label>
      </li>
    </ul>

    【讨论】:

    • 感谢您的帮助,但我无法真正理解并实施。它是否在页面加载时选中“全选”复选框?
    • 是否应该在页面加载时选择“全选”可能取决于正在加载的数据,假设您的页面可以保留一些状态服务器端。如果用户之前选择了所有内容,则jsonData.selectedFactors 将包含所有代码,并且“全选”框也将被选中。
    • 我从您的评论中了解到,将 JSON 中的所有因素分配给“selectedFactors”,以便在页面加载时检查“全选”。我已经尝试过了,它确实检查了“全选”和所有其他因素,但它的行为并不完全正确。如果我取消选中一个复选框,它仍然保持全选,理想情况下它应该取消选中“全选”并再次单击它应该选择之前未选中的那个。
    • 你试过我的例子吗?它确实具有您期望的行为。如果您需要针对特定​​场景的问题的帮助,请尝试将其作为minimal reproducible example 放在问题中,否则我们很难判断出了什么问题。
    • fiddle.jshell.net/likhi1/qFE2C 这是我尝试实现“全选”复选框的 Js 小提琴。不幸的是,你给出的例子对我不起作用。您能否建议修改js小提琴中给出的代码的解决方案。
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多