2012-02-22 12 views
2

選択した行のグループ化された行の小計を計算しようとしていますが、すべての要素をループすることで、すべての変更合計を計算できます。誰もグループ化された行から行の値を加算または減算する方法を提案することができます。膨大な数の行があり、すべてを選択するのに時間がかかります。ここに私のサンプルコードがありますhttp://jsfiddle.net/Srinivasa/PAtSd/2/JavascriptでKnockoutを使ってグループ化された行の小計を計算するには?

+0

これは良い質問です。あなたが現在持っているものを改善する明白な方法はありません。たぶん私はそれを+1すると、自分よりもスマートな人が見ているかもしれません。 – farina

+0

これはまともなアプローチだと私は同意します。多分、あなたの特定のインターフェイスは行の数を減らすために再考する必要があります。 – madcapnmckay

答えて

0

あなたのアプローチは私によく見えます。パフォーマンスに問題がある場合は、本当に大きな行数が必要です。その場合、実際にUIを再考したいと考えています。つまり、数量を選択して観測値を購読し、1冊の書籍の古い値と新しい値に基づいて合計を変更することで、実際に計算を最適化することができます。下のコードはアイデアを示していますが、完全な解決策ではありません。また、標準のknockoutjs observableにはのlastValue属性がありませんので、自分で実装する必要があります(hereはその方法の例です)。

あなたはコンストラクタを予約するパラメータとして、学生のviewmodelを渡す必要があります学生のレベルの小計については
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

おかげでローマン、これはルートモデルによく見えますが、あなたはどのようにして「学生」レベルの小計をすることができますか?私の実際の要求では、それぞれ10〜20行のサブ行を持つ約1000行を処理する必要があります。合計で10,000〜20,000です。パフォーマンスのわずかな改善も役立ちます。 –

+0

私は学生レベルの小計をカバーする答えを更新しました。これはまだ完全な解決策ではなく、単なるアイデアです。 –

関連する問題