ember.js - 路由器v2模板路径

时间:2013-01-26 09:48:51

标签: ember.js

我正在查看路由器v2,我发现我必须声明模板的完整路径,如下所示:

WZ.ApplicationRoute = Em.Route.extend
  renderTemplate: ->
    @render('app/templates/nav/nav', outlet: 'nav')

我可以用temmplateName属性创建一个视图,但我真的不想这样做。

我有没有办法像我这样定义模板:

@render('nav', outlet: 'nav')

2 个答案:

答案 0 :(得分:1)

在典型环境中,渲染模板时无需指定完整路径。恩伯没有做任何魔术。它在Ember.TEMPLATES中检查具有指定名称的模板。启动您的应用程序并从JS控制台尝试:

Ember.keys(Ember.TEMPLATES)

我的猜测是你的模板会在app/templates/nav/nav而不是导航下。

如何解决这个问题取决于您用来编译把手模板的内容。大多数构建系统都允许您指定模板名称的基本路径。

答案 1 :(得分:0)

Ember使用其约定来查找模板,该模板可以是直接名称,也可以是名称的路径。如果您只输入nav,则ember会假定它是名称。

关于此的最佳文档始终是源代码,在本例中是(file:packages / ember-routing / lib / system / route.js):

render: function(name, options) {
  if (typeof name === 'object' && !options) {
    options = name;
    name = this.routeName;
  }

  name = name ? name.replace(/\//g, '.') : this.routeName;

  var container = this.container,
      view = container.lookup('view:' + name),
      template = container.lookup('template:' + name);

  if (!view && !template) { return; }

  this.lastRenderedTemplate = name;

  options = normalizeOptions(this, name, template, options);
  view = setupView(view, container, options);

  appendView(this, view, options);
}

对你的问题的回应是

name = name ? name.replace(/\//g, '.') : this.routeName;

因此,ember的模板名称可以是您为模板指定的名称,也可以是基于所有斜杠转换为点的路径的名称(通过ember约定)。

更新,8.2.2013 - 在评论中回答@sudhanshu的问题

模板的使用方式是应用程序路由器的配置:

App.Router.map(function() {
  this.route("members");
  this.route("member",     { path: "/members/:refId" } );
  this.route("membernew",  { path: "/member/new" } );
});

上面的小例子显示了路由器的3个功能:

  • “members”只是名称并应用约定,即没有定义路径。因此,emberjs将自动使用该路径/members
  • “member”使用动态URL部分来识别资源并加载正确的成员。在这里,您必须定义路径。
  • “membernew”也定义了路径,因为我不想使用默认值/membernew

根据相同的约定,emberjs将尝试使用您在路由器中定义的名称加载模板。在上面的例子中,emberjs希望把手模板的名称为“members”,“member”和“membernew”。

上面未显示的功能是将路由级联到资源。请看http://emberjs.com/guides/routing/ emberjs团队写了一篇关于这个主题的非常好的指南。

因此,一般来说,emberjs基于一些很好的约定,允许你避免许多编码行。但是,你必须遵守惯例。对于更复杂的应用程序,这通常是不可能的。