在数据透视表中定位单元格

时间:2016-03-10 12:35:15

标签: knockout.js

是否有一种简单的方法来定位下面的数据透视表结构中的单元格,以便相应单元格中的值是多少? (请注意,数据集数组的更新应该自动反映)我想我只需要一个动态行到单元格的绑定方法 - 它甚至可以在knockout.js中使用吗?

我有一个像这样的数据透视表模板:

<table border="1">
    <tr><th>pivot</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th></tr>
    <tr><td>a</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>b</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>c</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>d</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>e</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>f</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>g</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>h</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td>i</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
</table>

和以下数据(在knockout.js中定义为observable)我想在网格中显示:

var dataset = [
        {x: 'a', y: 1, val: 'val_1'},
        {x: 'a', y: 1, val: 'val_2'},
        {x: 'a', y: 1, val: 'val_3'},
        {x: 'a', y: 2, val: 'val_4'},
        {x: 'a', y: 2, val: 'val_5'},
        {x: 'a', y: 2, val: 'val_6'},
        {x: 'a', y: 3, val: 'val_7'},
        {x: 'a', y: 4, val: 'val_8'},
        {x: 'a', y: 4, val: 'val_9'},
        {x: 'a', y: 5, val: 'val_10'},
    ];

我想知道是否可以绑定到现有的html结构,因为knockout.js似乎是一个&#39; DOM-generator&#39;使用集合时的框架。

2 个答案:

答案 0 :(得分:0)

正如@Jeroen所说,设想解决这个以某种方式被淘汰出局的问题并不困难。但是,Knockout的优势在于成为MVVM提供者,而您的示例标记由于缺少&lt; input /&gt;而没有提供任何双向绑定的可能性。元件。

我实际上已经开始编写一个示例,该示例将在表格中呈现您的数据集,但最终需要从视图模型内部了解DOM的结构。

这里有两个注意事项:

  1. 假设您不需要双向绑定,并且乐于使用具有DOM知识的函数 - 可能从视图模型中调用此函数 - 那么我可以提供一个简单的解决方案。 但是...... 这是不推荐的,因为MVVM的一个原则是你的视图模型没有拥有这方面的知识。
  2. 如果你希望通过Knockout进行双向绑定,那么你必须记住,你的数据集在理论上可以有任意数量的对象,指的是任意数量的表行和单元格。现在,假设Knockout将视图模型绑定到基于data-bind属性的模型视图,您必须动态添加这些属性,然后每次数据集突变时重新绑定 - 这种重新绑定将否定任何Knockout提供的优势。您还必须先从表格中删除所有现有的data-bind属性。
  3. 当然,有很多方法可以实现它。如果你愿意放弃双向绑定,那么有很多方法可以在没有Knockout的情况下做到这一点。

    我担心自己无法实现实用。

    一种可能的调查途径:我相信Ryan Niemeyer有一个Knockout插件,可以在不使用data-bind属性的情况下执行数据绑定,而且更加不引人注目。

答案 1 :(得分:0)

这是可能的,但会涉及一些开发 - X和Y列的两个循环(每个循环的唯一值)和交集的值。结果对于动态html非常好,但是在处理了JSON数组中的几万个元素后,整个解决方案开始变得迟缓。