路由器 v2 模板路径



我正在查看路由器v2,发现我必须像这样声明模板的完整路径:

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

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

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

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

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

Ember.keys(Ember.TEMPLATES)

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

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

Ember 使用其约定来查找模板,该模板要么是直接名称,要么是名称的路径。如果只键入 nav ,余烬假定它是名称。

关于这一点的最佳文档始终是源代码,在这种情况下是(文件: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 个功能:

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

按照相同的约定,emberjs 将尝试使用您在路由器中定义的名称加载模板。在上面的示例中,emberjs 希望车把模板具有名称"成员"、"成员"和"成员新"。

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

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

最新更新