2012-02-22 5 views
2

선택한 행에 대해 그룹화 된 행에 대한 소계를 계산하려고하는데 모든 요소를 ​​반복하면서 모든 변경 총계를 계산할 수 있지만 계산할 수 있습니다. 누구나 그룹화 된 행에서 행 값을 더하거나 뺄 수있는 방법을 제안 할 수 있습니다. 우리가 엄청난 수의 행을 가지고 있고, 모두를 선택하면 더 많은 시간이 걸린다. 여기 내 샘플 코드입니다 http://jsfiddle.net/Srinivasa/PAtSd/2/Javascript에서 녹아웃을 사용하여 그룹화 된 행의 부분합을 계산하는 방법은 무엇입니까?

+0

이것은 좋은 질문입니다. 현재 가지고있는 것을 개선 할 수있는 확실한 방법은 없습니다. 어쩌면 내가 +1하면 더 똑똑한 사람이 보일 수 있습니다. – farina

+0

괜찮은 접근이라고 나는 동의한다. 어쩌면 특정 인터페이스가 행 수를 줄이기 위해 재고 할 필요가있을 수 있습니다. – madcapnmckay

답변

0

당신의 접근 방식은 나에게 좋을 것 같습니다. 성능 문제가있는 경우 실제로 행 수가 많아야합니다.이 경우 UI를 다시 생각해보고 싶을 것입니다. 즉, 실제로 수량이으로 선택되어 관찰 값을 구독하고 한 권의 책에 대한 이전 값과 새 값을 기반으로 합계를 변경하여 계산을 최적화 할 수 있습니다. 아래 코드는 아이디어를 보여 주지만 완전한 해결책은 아닙니다. 또한, 표준 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); 
     }    
    } 
} 

학생 수준의 합계 위해 당신은 예약 매개 변수로 학생의 ViewModel을 통과해야합니다 생성자 :

당신은 아마 이런 식으로 학생들의 생성자를 변경해야합니다
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

Roman 씨, 루트 모델에 좋을 것 같습니다. '학생'수준의 소계를 위해 어떻게 할 수 있습니까? 내 실제 요구 사항에서, 나는 10 개에서 20 개의 서브 행을 갖는 약 1000 개의 행을 각각 10,000 개에서 20,000 개까지 처리해야합니다. 따라서 성능이 약간 향상 되어도 도움이됩니다. –

+0

학생 수준의 소계에 대한 답변을 업데이트했습니다. 이것은 여전히 ​​완전한 해결책은 아니며 아이디어 일뿐입니다. –

관련 문제