2011-08-09 3 views
3

빈 배열 ([])로 초기화 된 중첩 된 observableArrays에 집계 함수를 적용하면 내부 배열이 정의되지 않은 오류가 발생합니다. 이것은 빈 배열을 매개 변수로하여 생성 된 observableArray 객체에서만 발생합니다.중첩 된 중첩 observableArrays가 비어있는 대신 정의되지 않은 것처럼 보입니다.

이것은 버그 일 수 있지만, 아마/뭔가 잘 모르겠다.

아래 예제는 빈 배열 라인과 함께 작동 주석 :

을도에 : http://jsfiddle.net/adamtolley/4pZhR/32/

html로 :

<ul data-bind="template: { name: 'outerTmpl', foreach: outerArray}"></ul> 
Number of inner items: <span data-bind="text: innerCount"></span> 
<hr /> 

<div data-bind="text: ko.toJSON(viewModel)"></div> 

<script id="outerTmpl" type="text/html"> 
    <li> 
     <span data-bind="text: name"></span> 
     <ul data-bind="template: { name: 'innerTmpl', foreach: innerArray}"></ul> 
    </li> 
</script> 

<script id="innerTmpl" type="text/html"> 
    <li> 
     <span data-bind="text: name" /> 
    </li> 
</script> 

JS :

function outer(name, innerArray) { 
    return { 
     name: ko.observable(name), 
     innerArray: ko.observableArray(innerArray) 
    }; 
} 

function inner(name) { 
    return { 
     name: ko.observable(name) 
    }; 
} 

var viewModel = { 
    outerArray: ko.observableArray([ 
     new outer("outer1", [new inner("inner1"), new inner("inner2")]), 
     new outer("outer2", [new inner("inner1"), new inner("inner2")]) //, 
     // new outer("outer3", []) //does not work with this line uncommented. 
    ]) 
}; 

//use of innerArray().length vs innerArray.length seems to make no difference in error 
viewModel.innerCount = ko.dependentObservable(function() { 
    return this.outerArray().reduce(function(i, j) { 
     return i.innerArray.length + j.innerArray.length; 
    }); 
}, viewModel); 


ko.applyBindings(viewModel); 
+0

업데이트 : 코드가 다른 곳에서 코드가 잘못되었습니다 (아래 답변 참조). 실제로이 질문은 knockout.js와 관련이 없습니다. –

+1

이 문제를 실제 문제로 처리하는 것은 질문과 관련이 없습니다. 걱정하지 마라, 이것은 실제로 실제로 일어난다 :) –

답변

1

나는 생각한다 더 좋아할만한 것을 원할 것입니다 :

viewModel.innerCount = ko.dependentObservable(function() { 
    return this.outerArray().reduce(function(i, j) { 
     var count = i.innerArray ? i.innerArray().length : i; 
     return count + j.innerArray().length; 
    }); 
}, viewModel); 

reduce는 다음 반복에서 이전 결과를 i으로 전달합니다. 따라서 첫 번째 반복에는 두 개의 배열 만 있습니다.

+0

Oooooooooooooh는 내가 그 하나 위에서 총 틀린 장소를보고 있었던 것처럼 보인다. 필자는 필자가 필자의 필자가 줄이기 함수 (필자는 linq에서 빠져 나왔다. 나는 그것을 그리워한다)를 쓴다고 확신하지는 않지만,이 문제는 내 것이고 프레임 워크가 아닌 것에 기쁘다. –

+0

예, outerArray를 통해 반복하고 각 innerArray의 길이를 추가하는 작업을 단순화 할 수 있습니다. –

관련 문제