2012-02-22 24 views
2

我想计算所选行的分组行的子总数,我能够计算,但通过循环所有元素,每次更改总计算。任何人都可以建议如何从分组行中增加或减去行值。如果我们有大量的行,并选择所有正在花费更多的时间。这里是我的示例代码http://jsfiddle.net/Srinivasa/PAtSd/2/如何使用JavaScript中的Knockout计算分组行的小计?

+0

这是一个很好的问题。我没有看到一个明显的方法来改进您目前的工作。也许如果我给它一个比我自己更聪明的+1某人可以看看。 – farina 2012-02-22 22:12:26

+0

我同意这是体面的做法。也许你的具体接口需要重新思考,以减少行数。 – madcapnmckay 2012-02-23 00:21:18

回答

0

您的方法看起来不错。如果你有性能问题,你必须有大量的行,在这种情况下,你真的想重新考虑用户界面。也就是说,你可以通过订阅数量选择观察到并根据一本书的旧值和新值来更改总计。下面的代码说明了这个想法,但不是一个完整的解决方案。另外,标准的knockoutjs observable没有lastValue属性,所以你必须自己实现它(here是你如何去做的一个例子)。

function book(...){ 
    var self = this; 
    ... 
    self.qty.subscribe(function(newValue){ 
     if(self.selected()){ 
      //grandTotal is regular observable, not a computed one 
      var grandTotal = rootViewModel.grandTotal(); 
      grandTotal = grandTotal - self.qty.lastValue() + newValue; 
      rootViewModel(grandTotal); 
     }    
    } 
} 

学生级别的小计,你将需要通过学生的视图模型作为参数传递给预定的构造:

function book(student, name, qty){ 
    var self = this; 
    ... 
    self.qty.subscribe(function(newValue){ 
     if(self.selected()){ 
      //student.noOfBooks is regular observable, not a computed one 
      var noOfBooks = student.noOfBooks(); 
      noOfBooks = noOfBooks - self.qty.lastValue() + newValue; 
      student.noOfBooks(noOfBooks); 
     }    
    } 
} 

你可能会需要学生构造改变这样的事情:

function student(name, books /*array of plain object, not view models*/){ 
    var self = this; 
    self.name = name; 
    self.noOfBooks = ko.observable() 
    self.books = ko.utils.arrayMap(books, function(b){ 
     return new book(self, b.name, b.qty); 
    }); 
} 
+0

感谢罗马人,这对于根模型来说看起来不错,可以请你抛出一些想法,我们如何才能做到'学生'级别的小计?在我的实际需求中,我需要处理大约1000行,每行下面有10到20个子行,总计10,000到20,000。所以性能的小改进也有帮助。 – 2012-02-26 07:20:05

+0

我更新了答案以涵盖学生级别小计。这仍然不是一个完整的解决方案,只是一个想法。 – 2012-02-27 14:19:58