これをKOフォーラムに投稿しましたが、質問がここにあるため、ここにも追加しました.
これを行う良い方法は、テンプレートを再帰的に呼び出すことです。構造がネストされている場合は、毎回子をテンプレートに渡すことができます。構造がフラットな場合は、テンプレートに渡されるアイテムをフィルタリングする必要があります。
サンプルはこちら: http://jsfiddle.net/rniemeyer/Xydth/
フラット構造の場合、次のようになります。
<ul data-bind="template: { name: 'comment', foreach: viewModel.getChildren(0) }"></ul>
<script id="comment" type="text/html">
<li>
<span data-bind="text: content"></span>
<ul data-bind="template: { name: 'comment', foreach: viewModel.getChildren($data.id) }"></ul>
</li>
</script>
<script type="text/javascript">
function comment(id, parentId, content) {
this.id = id;
this.parentId = parentId;
this.content = ko.observable(content);
}
var viewModel = {
comments: ko.observableArray([
new comment(1, 0, "one content"),
new comment(2, 1, "two content"),
new comment(3, 0, "three content"),
new comment(4, 0, "four content"),
new comment(5, 4, "five content"),
new comment(6, 4, "six content"),
new comment(7, 6, "secent content"),
new comment(8, 0, "eight content")
]),
getChildren: function(parentId) {
return ko.utils.arrayFilter(this.comments(), function(comment) {
return comment.parentId == parentId;
});
}
};
ko.applyBindings(viewModel);
</script>