我正在查看路由器v2,我发现我必须声明模板的完整路径,如下所示:
WZ.ApplicationRoute = Em.Route.extend
renderTemplate: ->
@render('app/templates/nav/nav', outlet: 'nav')
我可以用temmplateName属性创建一个视图,但我真的不想这样做。
我有没有办法像我这样定义模板:
@render('nav', outlet: 'nav')
答案 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
。/membernew
根据相同的约定,emberjs将尝试使用您在路由器中定义的名称加载模板。在上面的例子中,emberjs希望把手模板的名称为“members”,“member”和“membernew”。
上面未显示的功能是将路由级联到资源。请看http://emberjs.com/guides/routing/ emberjs团队写了一篇关于这个主题的非常好的指南。
因此,一般来说,emberjs基于一些很好的约定,允许你避免许多编码行。但是,你必须遵守惯例。对于更复杂的应用程序,这通常是不可能的。