【问题标题】:Knockout: Create an organized table of buttons from observable array淘汰赛:从可观察数组创建一个有组织的按钮表
【发布时间】:2015-07-04 08:49:26
【问题描述】:

我正在尝试为给定数量的按钮创建一个包含四列按钮的表格(或列表)。一旦一行有四个按钮,它就会移动到下一行。我在使用敲除可观察数组来表示我的数据时遇到了麻烦。我在下面的代码为每个按钮生成一行,但我希望一行有四个按钮,然后再移动到下一行。考虑到我的数据的组织方式,有没有办法做到这一点?

HTML:

<table>
     <tbody data-bind="foreach: chosenModelData" id="timesteps">
          <tr>
             <td><button class="btn btn-default" data-bind="attr: {disabled: $data[2]}, 
                text: $data[0], click: $parent.load_image"></button></td>
          </tr>
     </tbody>
</table>

摘自我的 JS 文件:

for(var i = 0; i < json.images[0].length; i++) {
    self.chosenModelData.push([timestep[i], imgpath[i], false]);
}

编辑(使用虚拟元素):

<table id="mytable">
       <tbody data-bind="foreach: chosenModelData" id="timesteps">
             <!-- ko if: $index() % 4 === 0 || $index() === 0-->
                      <tr>
             <!-- /ko -->
                          <td><button class="btn btn-default" data-bind="attr: {disabled: $data[2]}, text: $data[0], click: $parent.load_image"></button></td>
             <!-- ko if: $index() % 4 === 0 || $index() === 0 -->
                      </tr>
             <!-- /ko -->
        </tbody>
</table>

之前:

之后(使用虚拟元素):

开发工具 html:

<table id="mytable">
                    <tbody data-bind="foreach: chosenModelData" id="timesteps">
                        <!-- ko if: $index() % 4 === 0 || $index() === 0 -->
                            <tr>
                        <!-- /ko -->
                                <td><button class="btn btn-default" data-bind="attr: {disabled: $data[2]}, text: $data[0], click: $parent.load_image"></button></td>
                        <!-- ko if: $index() % 4 === 0 || $index() === 0 -->
                            </tr>
                        <!-- /ko -->

                        <!-- ko if: $index() % 4 === 0 || $index() === 0 --><!-- /ko -->

                        <!-- ko if: $index() % 4 === 0 || $index() === 0 --><!-- /ko -->

                        <!-- ko if: $index() % 4 === 0 || $index() === 0 --><!-- /ko -->

                        <!-- ko if: $index() % 4 === 0 || $index() === 0 -->
                            <tr>
                        <!-- /ko -->
                                <td><button class="btn btn-default" data-bind="attr: {disabled: $data[2]}, text: $data[0], click: $parent.load_image"></button></td>
                        <!-- ko if: $index() % 4 === 0 || $index() === 0 -->
                            </tr>

【问题讨论】:

标签: javascript knockout.js


【解决方案1】:

我认为最简单的方法是将原始数组分成块。这应该会有所帮助:

function ViewModel() {
    var self = this;
    self.chosenModelData = ko.observableArray();

    self.dividedChosenModelData = ko.computed(function () {
        var size = 4;
        var items = self.chosenModelData();
        return [].concat.apply([],
          ko.utils.arrayMap(items, function(elem,i) {
            return i%size ? [] : [items.slice(i,i+size)];
          })
        );
    }, self);

    self.chosenModelData.push('1');
    self.chosenModelData.push('2');
    self.chosenModelData.push('3');
    self.chosenModelData.push('4');
    self.chosenModelData.push('5');
    self.chosenModelData.push('6');
    self.chosenModelData.push('7');
    self.chosenModelData.push('8');
    self.chosenModelData.push('9');


};

ko.applyBindings(new ViewModel());

HTML:

<table>
     <tbody id="timesteps">
         <!-- ko foreach: dividedChosenModelData -->
           <tr>
              <!-- ko foreach: $data -->
                <td><button class="btn btn-default" data-bind="text: $data"></button></td>
              <!-- /ko -->
            </tr>
         <!-- /ko -->
     </tbody>
</table>

http://jsfiddle.net/fpd94zL9/3/

【讨论】:

  • 这工作得很好,虽然当我在本地运行它时在页面上加载似乎很慢。有什么提高性能的技巧吗?在我的页面上单击按钮后创建按钮表,该按钮通过 AJAX 检索数据并将其存储到 selectedModelData 数组中。
  • 看起来很慢?您从 ajax 调用中检索了多少项目?
  • 最长的 55 项。当我最初尝试它时,它可能只是浏览器打嗝,因为现在看起来很好......
【解决方案2】:

你有没有尝试过这样的事情?

<table>
     <tbody data-bind="foreach: chosenModelData" id="timesteps">
        <!-- ko if: $index % 4 === 0 -->
           <tr>
        <!-- /ko -->
             <td><button class="btn btn-default" data-bind="attr: {disabled: $data[2]}, 
                text: $data[0], click: $parent.load_image"></button></td>
        <!-- ko if: $index % 4 === 0 -->
           </tr>
        <!-- /ko -->
     </tbody>
</table>

【讨论】:

  • 这看起来像我想要的,但是当我这样做时,按钮由于某种原因被弄乱了:它们没有显示它们的 css 或 html 属性,而且它们的数量更少。
  • 您可以通过任何方式发布 JSFiddle 或您的意思的屏幕截图吗?你是用 Jquery 应用 CSS 还是什么?它可能发生在早期导致样式混乱。 @wxcoder
  • 我已对 OP 进行了更改并包含了图像。 CSS 没有与 Jquery 一起应用,只是一个 .css 文件。
  • 如果您使用 if 检查开发工具中的元素,html 看起来是否正确?我的意思是 1 tr 中有 4 个 tds
  • 唯一的方法是进行上述答案的纯计算。似乎这也显示在这里。 stackoverflow.com/questions/21561588/…
猜你喜欢
  • 2012-09-08
  • 2023-04-06
  • 2018-08-02
  • 2015-10-05
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多