我是EmberJs的新手,我正在尝试做一些简单的事情,比如从列表中选择一个项目后显示详细视图。 我已经设置了this jsfiddle
在我的路由的renderTemplate函数中,我正在进行控制台日志记录,以查看是否曾调用该函数。对于我的PostsRoute,它可以工作,但我没有得到PostsDetailsRoute.renderTemplate的输出
模板
<script type="text/x-handlebars" id="posts">
<div class="container-fluid">
<div class="row-fluid">
<div class="span3">
<table class='table'>
<thead>
<tr><th>Recent Posts</th></tr>
</thead>
{{#each post in posts}}
<tr><td>
{{#linkTo details post.id}}{{post.title}}{{/linkTo}}
</td></tr>
{{/each}}
</table>
</div>
</div>
</div>
</script>
<script type="text/x-handlebars" data-template-name="posts/details">
{{post.description}}
</script>
路线
App.PostsDetailsRoute = Ember.Route.extend({
renderTemplate: function () {
console.log('template PostsDetails rendered');
this.render();
}
});
App.PostsRoute = Ember.Route.extend({
posts: [],
setupController: function (controller) {
controller.set('posts', App.Post.find());
},
renderTemplate: function () {
console.log('template Posts rendered');
this.render();
}
});
在旁注中,使用EmberJs的句柄栏模板的uing data-template-name和id有什么区别?
答案 0 :(得分:0)
这里有几件事情。
details
定义为资源,但您的应用将其用作路由。两者之间的差异可以在Ember.js guide中找到。注意命名约定的不同之处;如果将details
定义为子资源,则Ember会将其与DetailsController
控制器进行匹配。资源实际上是你想要的,但当代理论是它应该简称为post
,因此与PostController
,PostRoute
等匹配。这是你的路由器的样子:
App.Router.map(function () {
this.resource('about');
this.resource('posts', function () {
this.route('post', { path: ':post_id' });
});
});
您的详细信息没有{{outlet}}
标记可供呈现。你有一个UI决定:在帖子索引下面或新屏幕上发布详细信息吗?如果是前者,则需要在{{outlet}}
模板中添加posts
标记。如果是后者,则需要将posts
模板替换为{{outlet}}
,并将其当前内容移至posts/index
模板。
当链接到路线或资源时,您应该将实际模型传递给{{linkto}}
助手,而不是模型的id
。
当您通过post
向{{linkTo}}
路径提供模型时,路由器会将模型存储在控制器的content
属性中。由于PostController
默认为ObjectController
,因此它还会将模型的属性代理为this
。因此,在post
模板中,您应该通过description
或仅{{content.description}}
绑定到{{description}}
。
PostsRoute
中的模型挂钩加载帖子,从而为自己节省几个字符。 Ember会将结果安装在content
的{{1}}属性中,因此您需要稍微更新模板。