knockout.js 可观察数组表上方的静态行

Posted

技术标签:

【中文标题】knockout.js 可观察数组表上方的静态行【英文标题】:Static row above knockout.js observable array table 【发布时间】:2014-02-21 17:52:03 【问题描述】:

我有一个 html 表格,行来自一个可观察的数组....

 <tbody data-bind="foreach: TableArray">
     <tr>
         <td data-bind:"text: Item1"></td>

等等……

我怎样才能跳过第一行...所以我可以在表格顶部添加一个静态行(不是标题)。

<tbody data-bind="foreach: TableArray">
     <tr> 
        <td> Static Row </td>
     </tr>
     <tr>
         <td data-bind:"text: Item1"></td>

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是使用 Knockout 的无容器绑定语法。 请参阅 Knockout 的 foreach 绑定文档中的注 4。http://knockoutjs.com/documentation/foreach-binding.html


Javascript

var YourVM = function () 
    this.allItems = ko.observableArray(["Fries", "Eggs Benedict", "Ham", "Cheese"]);
;

ko.applyBindings(new YourVM());

HTML

     <table>
       <thead>
         <tr>
           <th>Your Column</th>
         </tr>
       </thead>
       <tbody>
         <tr class="row-static">
           <td>Static Row</td>
         </tr>    <!-- ko foreach: allItems -->
         <tr>
           <td data-bind="text: $data"></td>
         </tr>    <!-- /ko -->     
       </tbody>
    </table>

JS Bin 上的实例http://jsbin.com/AzEwEce/1/edit

【讨论】:

@JamesMcConnell - 在这方面绝对同意你对 Angular 的看法。 github.com/angular/angular.js/issues/1891【参考方案2】:

您可以使用if binding 仅在“第一次”传递时输出额外的一行。

Example:

<table data-bind ="foreach: rows">

  <tr data-bind="if: $index() == 0" >
    <td><span data-bind="text: $index"></span></td>
  </tr>
  <tr>
    <td><span data-bind="text: text"></span></td>
  </tr>
</table>

【讨论】:

【参考方案3】:

秘密在于无容器的 foreach 标记。检查以下链接的“注4”:

http://knockoutjs.com/documentation/foreach-binding.html

这是一个显示基本示例的小提琴。

http://jsfiddle.net/internetH3ro/M9f4D/7/

基本视图模型:

function ViewModel() 
    var self = this;
    self.items = [
        firstName: 'James',
        lastName: 'McConnell'
    ,
        firstName: 'Scott',
        lastName: 'Hanselman'
    ,
        firstName: 'Bill',
        lastName: 'Gates'
    ];

HTML 标记:

<table>
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
    </tr>
    <!-- ko foreach: items -->
    <tr>
        <td><span data-bind="text: $data.firstName"></span></td>
        <td><span data-bind="text: $data.lastName"></span></td>
    </tr>
    <!-- /ko -->
</table>

因此,您只需将要重复的内容包装在注释中,Knockout 就会为您集合中的每个元素重复该内容。非常漂亮,我希望 Angular 有这样的东西。

【讨论】:

同意 Angular;也许 AngularJS 没有无容器绑定语法,但它确实提供了一种简洁的语法,它提供了与 Knockout 的无容器 foreach 相同的功能。 ***.com/a/21446102/538962 这是正确的答案 - 遗憾的是“user314...”无法为您提供答案。 嗯,不用太担心。我来这里寻求帮助,并尽我所能回馈,这就是我真正关心的一切。 :) 感谢您的认可,非常感谢! 完美!!!救了我!将data-bind="foreach: items" 添加到&lt;tbody&gt;s 会添加一个新的&lt;tbody&gt;...但是(!!!!!!)将其添加到&lt;tr&gt;s 不会创建新的&lt;tr&gt;s。 非常感谢您分享这个。这对我帮助很大!

以上是关于knockout.js 可观察数组表上方的静态行的主要内容,如果未能解决你的问题,请参考以下文章

Knockout.js:当可观察数组中的值发生变化时触发计算的最佳方法是啥

Knockout Js:可观察数组的SORT函数如何工作

将多个输入绑定到可观察数组中的同一变量(Knockout.JS)

Knockout JS,如何在更改可观察数组中的值时更改样式属性

Knockout JS - 在没有 ko.mapping 的情况下观察数组的任何属性中的突变

Knockout/Select2:触发 select2 根据可观察的选项更新进行更新