【问题标题】:Ember-CLI Routing: Changed my route/template structure, but build does not recognize the changes?Ember-CLI 路由:更改了我的路由/模板结构,但构建无法识别更改?
【发布时间】:2014-07-03 18:52:42
【问题描述】:

我刚刚在 ember-cli 中更改了我的路由结构并破坏了我的应用程序。我想将我当前的结构嵌套更深一层......

之前:

Router.map(function() {
    this.resource('placements', function() {
        this.route('add');
        this.route('import');
        this.route('open');
    });
    this.route('admin');
});

之后:

Router.map(function() {
    this.resource('portal', function() {
        this.resource('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

我的模板结构也需要改变...

之前:

- templates/
-     placements/
-         add.hbs
-         import.hbs
-         index.hbs
-         open.hbs
-     admin.hbs
-     application.hbs
-     index.hbs
-     placements.hbs

之后:

- templates/
-     portal/
-         placements/
-             add.hbs
-             import.hbs
-             index.hbs
-             open.hbs
-         admin.hbs
-         index.hbs
-         placements.hbs
-     application.hbs
-     index.hbs
-     portal.hbs

我以为我已经一对一地进行了所有更改,但由于某种原因,当我重新启动 ember 服务器时,嵌套的“放置”路线被破坏了。

控制台日志中,我注意到 ember 仍在尝试在旧的 templates/placements/index 下查找 placements.index 而不是新目录。

有一种理论认为模板不能像路由器那样嵌套?这意味着我可能需要使用 renderTemplate hook 明确定义每条路线,以便它显示正确的模板......这可能会很痛苦,因为这个项目将非常大。 ..也许我做错了什么?

【问题讨论】:

  • 我不确定您是否需要嵌套模板目录。我认为 Ember 不会做多于一层的模板解析,即使路由嵌套多于一层。
  • 如果这是真的,那么它就说明了问题......但是如何定义这样的嵌套结构并让 ember 能够找到正确的模板?
  • 我认为 Ember 的模板解析总是去 templates/resource/route.hbs。即使路径中的资源嵌套在另一个原因下。这有点像当你过渡到一条路线时,你总是会去route.transitionTo('placements.add')而不是route.transitionTo('portal.placements.add'),例如。我认为这个想法是为了减少app逻辑和url结构之间的耦合,所以可以改变url而不需要完全改变app中的逻辑。
  • @Adam 问题是placements.hbs 有一个{{output}} 并且默认情况下在其中有一个“索引”,以及其他3个页面(添加,导入,打开)在内部呈现它...现在通过向上碰撞placements/ 目录,它会杀死placements.hbs 并只渲染index.hbs... 我希望这是有道理的
  • 我对它的工作原理的理解可能从一开始就有缺陷......但是当只有一层深度时它工作正常

标签: ember.js ember-cli


【解决方案1】:

在完成 cmets 工作后,@Adam 离开了我。我能够找出使用模板的正确方法。

模板,确实不嵌套在与资源/路由完全相同的模式中。

鉴于我制作的新路线结构:

Router.map(function() {
    this.resource('portal', function() {
        this.resource('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

模板的结构应如下所示:

- templates/
-     placements/
-         add.hbs
-         import.hbs
-         index.hbs
-         open.hbs
-     portal/
-         admin.hbs
-         index.hbs
-     application.hbs
-     index.hbs
-     placements.hbs
-     portal.hbs

当您定义一个“资源”时,这实质上会导致该特定路由成为顶级对象,而不管它在路由器映射中的嵌套程度如何。 placements.hbsportal.hbs(从上面)是“资源”(顶层)模板,并相应地放置在模板目录的顶层。

由于这两个“资源”模板各有一个{{outlet}},因此“子”路由模板需要放置在以其相应资源命名的顶级目录中。

Ember-CLI 文档描述了这种模式,只展示了一个深度的示例,所以我首先假设该模式重复深入。我希望这有助于阐明学习 Ember 的其他人的实际路径。


更新:

截至 EMBER 1.7.0

路线现在可以嵌套了!

这对我个人来说是令人振奋的消息,但值得对此答案进行更新。

资源仍然可以像上面的例子一样使用,所以如果你对此感到满意,你可以继续这样做一段时间。但请记住,资源计划用于最终弃用路径。最终,只会有路由和嵌套路由。

好消息是,如果您遵循新模式,您可以更自然地嵌套模板以匹配您的路由器结构,就像自然 REST 风格的应用程序一样。不再有尴尬的思维导图。

例如上面的同一个路由器(略有变化):

Router.map(function() {
    this.route('portal', function() {
        this.route('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

模板的结构如下:

- templates/
-     portal/
-         placements/
-             add.hbs
-             import.hbs
-             index.hbs
-             open.hbs
-         admin.hbs
-         index.hbs
-         placements.hbs
-     application.hbs
-     index.hbs
-     portal.hbs

同样的模式也适用于嵌套对应的/routes、/controllers、/adapter等。

这也意味着(使用这个新模式){{link-to}} 助手和transitionTo 方法需要包含路由的完整路径:例如{{link-to 'portal.placements.index'}}.

【讨论】:

  • Grapho 感谢您对该主题的宝贵研究。当我要选择使用哪种策略时,你能告诉我你在哪里读到的关于资源使用弃用的信息?
  • @masciugo 我试图跟上emberjs.com/blog 上的博客文章,他们在那里发布关于开发和更改的公告。我也在 IRC #emberjs,在那里也听到了很多声音
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多