【问题标题】:collection with dynamic multiple tables using knockout使用淘汰赛具有动态多个表的集合
【发布时间】:2023-03-04 03:14:02
【问题描述】:

我有一个集合,需要一张一张地显示为表格。 例如,在集合 0 中,它可以包含 2 条记录的列表,每条记录可以包含 3 列。- 这必须显示在表 1 中

在集合 1 中的下一个它可以包含 3 条记录的列表,每条记录可以包含 3 列 - 这必须显示在表 2 中

这个集合在循环中运行,我必须根据集合 Items 重复它

下面是敲门代码

function TestPageModel() {

    var self = this;
    self.MHxReport = ko.observableArray([]);

    function addMHxReport(columnList ) {
        return {
            ColumnList: ko.observableArray(columnList)            
        }
    }

    function add(term, mhstdat,mhendat) {
        return {            
            Term: ko.observable(term),
            Mhstdat: ko.observable(mhstdat),            
            Mhendat: ko.observable(mhendat)
        }
    }

    var cList = [];
    var columnList = [];
    var aList = [];

    cList.push(new add("cough", "13MAR2018", "10SEP2018"));
    cList.push(new add("ashtma", "13MAR2018", "06NOV2018"));

    aList.push(new add("blood", "13MAR2018", "10SEP2018"));
    aList.push(new add("ear", "13MAR2018", "10SEP2018"));
    aList.push(new add("head", "13MAR2018", "10SEP2018"));

    columnList[0] = cList;
    columnList[1] = aList;

    var newobj = new addMHxReport(columnList )
    self.MHxReport.push(newobj);
}

$(document).ready(function () {
    var testPageModel = new TestPageModel();    
    ko.applyBindings(TestPageModel);
});

下面是html代码

<div class="row" data-bind="foreach: MHxReport">
        <div style="margin:12px 0 12px 0;">
            <div class="col-sm-12 col-md-12 col-lg-12">             
                <div class="table-responsive dsg-btm-shadow" style="border: 1px solid #ccc;margin: 0 0 15px 0px;" >
                    <table class="dsg-setup dsg-aligntop" border="0" >
                        <tbody data-bind="foreach: ColumnList" >
                            <tr>
                                <td><span data-bind='text: $data'></span></td>
                            </tr>
                        </tbody>
                    </table>

                </div>           
            </div>
        </div>
    </div>  

问题是我无法将其显示为行和列的表。不确定 缺少什么以及如何让代码在行和列中显示。 任何人都可以帮忙。请提前致谢

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    在您的代码中,ColumnList 是一个数组数组。所以,text: $data 将显示[object Object],[object Object]。根据您的问题,您希望在多个表格中显示它们,但您正在创建一个表格。所以,将foreach: ColumnList 移到table 部分之外。

    function TestPageModel() {
    
      var self = this;
      self.MHxReport = ko.observableArray([]);
    
      function addMHxReport(columnList) {
        return {
          ColumnList: ko.observableArray(columnList)
        }
      }
    
      function add(term, mhstdat, mhendat) {
        return {
          Term: ko.observable(term),
          Mhstdat: ko.observable(mhstdat),
          Mhendat: ko.observable(mhendat)
        }
      }
    
      var cList = [];
      var columnList = [];
      var aList = [];
    
      cList.push(new add("cough", "13MAR2018", "10SEP2018"));
      cList.push(new add("ashtma", "13MAR2018", "06NOV2018"));
    
      aList.push(new add("blood", "13MAR2018", "10SEP2018"));
      aList.push(new add("ear", "13MAR2018", "10SEP2018"));
      aList.push(new add("head", "13MAR2018", "10SEP2018"));
    
      columnList.push(cList, aList)
    
      var newobj = new addMHxReport(columnList)
      self.MHxReport.push(newobj);
    }
    
    $(document).ready(function() {
      var testPageModel = new TestPageModel();
      ko.applyBindings(TestPageModel);
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css">
    
    <div class="row" data-bind="foreach: MHxReport">
      <div style="margin:12px 0 12px 0;">
        <div class="col-sm-12 col-md-12 col-lg-12">
          <div class="table-responsive dsg-btm-shadow" data-bind="foreach: ColumnList">
          <span data-bind="text: 'table '+$index()"></span>
            <table class="dsg-setup dsg-aligntop table" style="padding:10px" border="0">
              <tbody data-bind="foreach: $data">
                <tr>
                  <td><span data-bind='text: Term'></span></td>
                  <td><span data-bind='text: Mhstdat'></span></td>
                  <td><span data-bind='text: Mhendat'></span></td>
                </tr>
              </tbody>
            </table>
            <br> <br>
          </div>
        </div>
      </div>
    </div>

    点击“运行代码sn-p”进行测试。这里也是fiddle


    更新

    如果您事先不确定列名并希望从对象中获取它们,那么您可以遍历每个对象的keys,然后将该键的value 绑定到td。像这样:

    function TestPageModel() {
    
      var self = this;
      self.MHxReport = ko.observableArray([]);
    
      function addMHxReport(columnList) {
        return {
          ColumnList: ko.observableArray(columnList)
        }
      }
    
      function add(term, mhstdat, mhendat) {
        return {
          Term: ko.observable(term),
          Mhstdat: ko.observable(mhstdat),
          Mhendat: ko.observable(mhendat)
        }
      }
    
      var columnList = [];
      var cList = [];
    
      cList.push(new add("cough", "13MAR2018", "10SEP2018"));
      cList.push(new add("ashtma", "13MAR2018", "06NOV2018"));
    
      // Has five columns
      var aList = [{
          Term: ko.observable("eyes"),
          Diagnosis:ko.observable("surgery"),
          Type:ko.observable("Major"),
          Mhstdat: ko.observable("19NOV2018"),
          Mhendat: ko.observable("20NOV2018"),
        },
        {
          Term: ko.observable("hands"),
          Diagnosis:ko.observable("transplant"),
          Type:ko.observable("Critical"),
          Mhstdat: ko.observable("21NOV2018"),
          Mhendat: ko.observable("22NOV2018"),
        }
      ];
    
      columnList.push(cList, aList)
    
      var newobj = new addMHxReport(columnList)
      self.MHxReport.push(newobj);
    }
    
    $(document).ready(function() {
      var testPageModel = new TestPageModel();
      ko.applyBindings(TestPageModel);
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css">
    
    <div class="row" data-bind="foreach: MHxReport">
      <div style="margin:12px 0 12px 0;">
        <div class="col-sm-12 col-md-12 col-lg-12">
          <div class="table-responsive dsg-btm-shadow" data-bind="foreach: ColumnList">
            <span data-bind="text: 'table '+$index()"></span>
            <table class="dsg-setup dsg-aligntop table" style="padding:10px" border="0">
              <tbody data-bind="foreach: $data">
                <tr data-bind="foreach: { data: Object.keys($data), as: 'key' }">
                  <td><span data-bind='text: $parent[key]'></span></td>
                </tr>
              </tbody>
            </table>
            <br> <br>
          </div>
        </div>
      </div>
    </div>

    【讨论】:

    • 对于例子我已经给出了函数“add”并带来了理解。但是在实际场景中,假设第一张表只能包含 2 列,第二张表可以包含 3 列,第三张表可以包含 5 列。所以使用循环我需要显示我在表中的列的数据。请建议和帮助。提前致谢
    • @jaiganesh 这就是为什么你应该在提问时创建Minimal, Complete, and Verifiable example。因为从问题来看,您似乎只有 3 列。无论如何,我已经更新了动态处理不同列数的答案。
    • 此更新有助于获得所需的功能。对于理解的动摇,我一直保持简单。但是我还需要两件事。 - 表格应该显示表格集合中的标题,并且它应该能够在表格中进行排序功能。请建议和帮助。提前致谢
    • @jaiganesh 表头应该很简单。请仔细阅读更新的答案并理解它。我已经展示了如何遍历键。现在,您只需遍历这些键并将它们绑定到ths。排序,真的吗?我已经回答了您的问题以及您在 cmets 中添加的其他功能。抱歉,我不能再做这 2 件事。当您遇到困难时,stackoverflow 上的人们会志愿服务他们的时间来帮助您。请尊重这一点。这是问答网站。 不是免费的代码编写服务
    • 为了调试 html 部分,使用 console.log 作为“$data”我只能看到数组。但是,要了解“Object.Keys”内部发生了什么以及如何使用它们来获取列名的名称对我来说并不理解。如果有更好的方法来调试和理解流程请提出建议和帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2015-05-01
    • 2017-08-12
    • 2014-04-22
    • 2012-11-25
    • 2013-01-29
    • 2016-03-15
    相关资源
    最近更新 更多