如何使用流星模板创建类似目录的结构?

时间:2013-07-10 09:36:53

标签: templates recursion directory meteor

考虑我的预期输出的这个模型:

Intended structure

Mongo数据库中的数据结构看起来像这样 - 我没有将子类别嵌套在文档中,因为我仍然希望能够原子地更新子文档 - 我还想在下面允许动态数量的图层。从我所看到的,Mongo目前不允许轻松,动态地访问嵌套文档。

topmost_category = {
  _id : "foo",
  category_name : "Example",
  parent_category: null,
  subcatories: [ "sub_foo1", "sub_foo2", ... ]
}

child_category = {
  _id = "sub_foo1",
  category_name : "Example 2",
  parent_category: "foo",
  subcategories: []
}

底层HTML只包含嵌套的-branches。当前选定的类别获得“活动”类,前面的图标名为“icon-folder-close”和“icon-folder-open”(<i class="icon-folder-close"></i>)。

现在,我可以使用this的答案来创建一个完整的树状结构。但是,所有分支都是“开放的”。我如何制作它,以便只有当前选定的分支可见,如我的模型中所示(并且仍然具有反应引导)?

2 个答案:

答案 0 :(得分:2)

你可以看到Hubert在这里描述的非常类似方法的实现:

http://www.meteorpedia.com/read/Trees

这是wiki(工作)类别浏览器功能的代码(你可以在那里看到一个演示)。

Hubert的答案的主要区别在于它使用带有会话变量的发布/订阅来实时获取已打开子项的数据。

答案 1 :(得分:1)

最简单的方法是为分支添加一个布尔标志,表示它们是否属于当前路径,因此应该打开。

<template name="branch">

    {{#if open}}
        <div class="openBranch">
            ...
            {{#each children}}
                ...
            {{/each
        </div>
    {{else}}
        <div class="closedBranch">
            ...
        </div>
    {{/if}}

</template>

现在,此标志的设置和管理取决于应用程序的逻辑。您在哪里存储当前选定的分支?

我认为该州只限于一个客户。在这种情况下,一种解决方案是:

  • 维护一组已打开的分支ID,其范围限定为单个文件,
  • open标志实现为帮助程序:

Template.branch.open = function() {
    return _.indexOf(openedBranches, this._id) !== -1;
}

  • 当用户更改选择时,清除阵列并使用从所选分支到顶部的路径填充它。