오후 내내 foreach
루프의 예제를 보았습니다. knockout
에 루프가 있으며 작동하지 못했습니다. 내 현재 설정, 적어도 관련 부분은 아래 있습니다.knockout.js 중첩 배열의 foreach 중첩
뷰 모델 :
var sample = {
this.pageData = ko.observable();
this.panels = ko.observableArray();
};
ko.utils.extend(sample.prototype, {
activate: {
this.pageData(sampleData);
this.panels([
{
name: 'column1',
keys: ['key1', 'key2', 'key3'],
loadedWidgets: ko.observableArray()
},
{
name: 'column2',
keys: ['key4', 'key5'],
loadedWidgets: ko.observableArray()
},
{
name: 'column3',
keys: ['key6'],
loadedWidgets: ko.observableArray()
}
]);
this.loadWidgetPanels(this.panels(), this.pageData());
},
loadWidgetPanels: function (panels, pageData) {
for (var i = 0; i < panels.length; i++) {
var screens = filterContentByKey(pageData.Content, panels[i].keys);
if (screens) {
panels[i].loadedWidgets.push(widgetFactory.getWidgets(screens));
}
}
}
}
보기 :
<div>
<!-- ko foreach: panels -->
<div class="3columnStyle">
<!-- ko foreach: loadedWidgets -->
<!--ko compose: $data --><!-- /ko -->
<!-- /ko -->
</div>
<!-- /ko -->
</div>
내가 내
loadedWidgets
에 올바른 형식의 올바른 데이터를 다시 얻고 있음을 확인했습니다
하지만 돈 보기에 표시되지 않습니다. DOM에 각 위젯에 대한 ko compose
요소가 있으므로보기에 최소한 데이터가 얼마나 있는지 알 수 있습니다. 예를 들어, 첫 번째 열은 소수의 위젯을 가지고 있으며, div는 소수의 위젯만으로 생성됩니다. 열 2에는 2 개의 위젯이 있으며 2 compose
개의 요소가 있습니다. 3 열은 1 개의 위젯을 가지고 하나의 요소를 가져옵니다. 그것은 단지 위젯 자체를 표시하지 않습니다. 어딘가에서 추가 요소 나 추가 바인딩이 필요한가요?
중첩 루프에 의존하지 않는이 작업 모델이 있습니다. 객체 배열을 사용하는 대신 관찰 가능한 배열을 각각 만듭니다. 즉, 루핑되지 않습니다. 하나의 배열에 각각 자체 배열이있는 세 개의 객체가 포함 된 배열 대신 세 개의 배열이 있습니다.
this.column1Widgets();
this.column2Widgets();
this.column3Widgets();
이들은 루핑 대신 수동으로 구성됩니다. 그리고 더보기 다음과 같습니다
<div class="3columnStyle">
<!-- ko foreach: column3Widgets -->
<!-- ko compose: $data --><!-- /ko -->
<!-- /ko -->
</div>
<div class="3columnStyle">
<!-- ko foreach: column3Widgets -->
<!-- ko compose: $data --><!-- /ko -->
<!-- /ko -->
</div>
<div class="3columnStyle">
<!-- ko foreach: column3Widgets -->
<!-- ko compose: $data --><!-- /ko -->
<!-- /ko -->
</div>
나는 그것이 중첩 된 루프 작동하지 않는 이유를 잘 모르겠지만, 데이터가 동일하기 때문에, 내가 위로 설정에서 누락 뭔가가있을거야 전망.
문제를 보여주는 jsfiddle, jsbin 또는 plunker를 만드실 수 있습니까? 그러면 도움이 훨씬 쉬워 질 것입니다. –
컨테이너가 아닌 바인딩 (예 : div에 'foreach'바인딩 사용)을 사용해 보셨습니까? 나는 그것을 할 것이고, 그 다음 knockout 컨텍스트 디버거를 사용하여 크롬에 대해 재미있는 일이 있는지 확인할 수 있습니다 ... – gerrod