2012-04-23 50 views
1

这个问题在我的原始和第一个问题'Nested Data, Loading Children'之后。KnockoutJS - 行和列计算

我有一个表中填充了来自包含嵌套对象的JSON的数据(请参见颜色编码)。该表包含每个可编辑对象的一行。这称为“分配”行。

这些值由JSON对象填充(“Values”:{“ n”:4,“n2”:2等)。

首先我想显示每个可编辑行的总数。由于值在行内更新了总更新。这个背后的用例是我想比较原始总数(Allocation.Total)和可观察总数,所以我可以更改控件单元格上的css类以指示数据是否已更改。

这如下所示; (黄色指示的用户的变化)

http://i.stack.imgur.com/XQpLp.jpg

问题的第二部分是处理一列总计。上面的问题让我的头部受到了一点伤害,但是这个打击了我的头脑。因此,我会睡在那一个,然后更新问题,一旦它变得更清楚一点。

从使用简化的数据模型出现了一种复杂化。通过说所有事物都是相同类型的对象,(机组人员),当节点有孩子时,用于分配的词需要改变。如果节点有儿童'分配'应该被称为指南。

Simplified Code Example here...

与柱体部...的Allocated.Total更新,是一个运行总的划分。这里的区别在于这个总数正在表格的列中排列,没有排在单个行上。这甚至有可能吗?我的思绪开始融化了一点。

更新 - 四月 26日

对于列总计虽然可以通过硬编码针对节点1,节点2,节点3接近这一点。我希望避免这种情况,因为这些是根据用户/请求而改变的节点(例如,它不总是节点1,节点2,节点3)。我已经在HTML模板中解决了这个问题,因为这些信息可以在服务器端找到,使我能够使用正确的绑定来提供页面。

我可以对JavaScript使用相同的方法,但是当我们从API中加载数据时,必须可以动态获取这些信息,然后JavaScript仍然很干净。我一直在研究如何迭代(键,对)值,所以node1,node2,node3位可以变为动态的。然而,这是我陷入困境的地方。

第二部分,它变得非常复杂。总分是我之后的一部分,但我也需要每个专栏的总额(周一 - 早餐,周一 - 午餐,周一 - 晚餐)。这从最深的节点级联到最高级。

Redeemed也是如此。因此,一个人可以兑换一张票,它一直反映到父节点。作为喜欢XPath的人,这将是祖先或自己::船员。

回答

1

好的。这是你的总计算应该是什么。

self.totalAllocation = ko.computed(function() { 
      var values = self.Allocation.Values; 
      return Number(values.node1()) + 
        Number(values.node2()) + 
        Number(values.node3()); 
}) 

注意节点周围的括号。这表明这些已经变成了淘汰赛的观测对象。在你当前的代码中,它们只是json值。非观察对象可以绑定到淘汰赛价值/文本绑定,但是当价值发生变化时,他们不会通知其他人。如果totalAllocation使用简单的json值,那么当它们通过值绑定进行更改时,它不会自动重新计算。

我更新了您的示例以使用映射插件。这将自动旋转你的所有属性,并使它们成为可观察的。

分配的标签是一个简单的标签。这可以通过计算和文本绑定来实现。

self.allocLabel = ko.computed(function() { 
    return self.HasChildren() ? "Guide" : "Allocation";    
}); 

<th data-bind="text: allocLabel">Allocation</th> 

我在最后一部分没有完全清楚。您似乎希望Allocated.Total将其所有子分配总和。这是否包括赎回价值?它是否应该包含自己的分配总额?无论答案如何,再做一次计算可观测量。

有点像。

self.grandTotal = ko.computed(function() { 
    var result = 0;    
    for (var i = 0; i < self.Crews().length; i += 1) { 
     result += self.Crews()[i].totalAllocation(); 
    } 
    return result; 
}); 

你可以看到我简单地通过了Crews数组,并总结了每个孩子的totalAllocation。如果您更新行分配编号,则行总数和列总数会更新。

http://jsfiddle.net/madcapnmckay/CGBZe/

编辑

正如在评论中提到。动态总计不应该是一个问题(未经测试)。

self.totalAllocation = ko.computed(function() { 
    var values = self.Allocation.Values; 
    var total = 0; 
    for (var prop in values) { 
     total += Number(ko.utils.unwrapObservable(values[prop])); 
    } 
    return total; 
}) 

希望这会有所帮助。

+0

令人难以置信的帮助!谢谢,我已经能够在此基础上实现一些附加功能。我已经更新了原始文章,并在Columns位上详细说明了这个问题,它有点儿怪异。 – uniquelau 2012-04-26 15:42:59

+0

嗨@madcapnmckay - 重新编辑之后您有什么进一步的想法吗?明天再去看看,看看还有什么我可以想出来的,否则,我会标记为已解决(再次感谢!)Lau – uniquelau 2012-05-02 15:52:33

+0

@uniquelau - 嗨,对不起,我迟到了。最近很多,动态问题应该可以通过遍历Values对象来解决(见编辑),其他的总计应该能够以与grandTotal类似的方式计算,但是限制在那个特定的索引(列)。首先得到这个最低级别的节点,然后让父节点和他们的孩子一起工作 – madcapnmckay 2012-05-07 04:37:38