EmberJS - 如何重构嵌入式模型?
EmberJS - how to restructure embedded models?
注意:使用Ember Rails 0.18.2 和ember-source 1.12.1
我继承了一个具有奇怪功能的 Ember 应用程序。我是 Ember 的新手,所以这可能是正常的,但我觉得很奇怪。
有3个型号:
- Parents
- 游戏
- 评论
当 Parent 观看游戏时 url 看起来像这样:
/<parent slug>/games/<game_id>
(slug 只是 parent 的唯一 ID)。
在此 url 有一个模板具有以下代码:
{{#unless commentsOpen}}
{{#link-to 'comments' class="Button easyButton"}}Chat with parents in your pod{{/link-to}}
{{/unless}}
{{outlet}}
单击上面的按钮然后将 url 更改为:
/<parent slug>/games/<game_id>/comments
然后会显示该游戏的所有评论。
我需要从视图中删除该按钮并自动显示每个游戏的评论。
API 是 Rails,我已经可以在请求游戏的同时将 API 端点更改为 return 所有评论(作为object 的嵌入式数组)。
但是我应该用什么来代替{{outlet}}呢?因为我的理解是 {{outlet}} 由于这条路线委托给 Comments 模板:
App.CommentsRoute = Ember.Route.extend
model: ->
return this.store.find('comment', {
game: @modelFor('game').get('id')
parent: @modelFor('parent').get('slug')
}).then( (models) -> models.toArray() )
我认为我需要删除该路由并使评论嵌入 object 到游戏模型中。然后我只是用类似的东西替换插座:
{{#each comment in Game}}
<div class="commentItem">
<div class="commentItem-author">{{comment.parent_name}}</div>
<div class="commentItem-body">{{comment.body}}</div>
</div>
{{each}}
编辑
这是路由器:
App.Router.map(function() {
this.route('index', {
path: '/'
});
return this.resource('parent', {
path: '/:parent_id'
}, function() {
this.resource('games', {
path: '/games'
});
return this.resource('game', {
path: '/game/:game_id'
}, function() {
return this.resource('comments', {
path: '/comments'
});
});
});
});
假设您有当前的应用程序,并且大概在某处有一个游戏列表,例如:
{{#each games as |game|}}
<li>
{{#link-to 'game' game}}
{{game.title}}
{{/link-to}}
</li>
{{/each}}
您应该可以直接通过评论路由到游戏,方法是将您的 link- 更改为,如下所示:
{{#link-to 'games.game.comments' game}}
这里有一个twiddle有详细的解决方法
在游戏中嵌入评论就是答案。然后视图是这样的:
{{#each comment in model.comments}}
<div class="commentItem">
<div class="commentItem-author">{{comment.parent_name}}</div>
<div class="commentItem-body">{{comment.body}}</div>
</div>
{{/each}}
注意:使用Ember Rails 0.18.2 和ember-source 1.12.1
我继承了一个具有奇怪功能的 Ember 应用程序。我是 Ember 的新手,所以这可能是正常的,但我觉得很奇怪。
有3个型号:
- Parents
- 游戏
- 评论
当 Parent 观看游戏时 url 看起来像这样:
/<parent slug>/games/<game_id>
(slug 只是 parent 的唯一 ID)。
在此 url 有一个模板具有以下代码:
{{#unless commentsOpen}}
{{#link-to 'comments' class="Button easyButton"}}Chat with parents in your pod{{/link-to}}
{{/unless}}
{{outlet}}
单击上面的按钮然后将 url 更改为:
/<parent slug>/games/<game_id>/comments
然后会显示该游戏的所有评论。
我需要从视图中删除该按钮并自动显示每个游戏的评论。
API 是 Rails,我已经可以在请求游戏的同时将 API 端点更改为 return 所有评论(作为object 的嵌入式数组)。
但是我应该用什么来代替{{outlet}}呢?因为我的理解是 {{outlet}} 由于这条路线委托给 Comments 模板:
App.CommentsRoute = Ember.Route.extend
model: ->
return this.store.find('comment', {
game: @modelFor('game').get('id')
parent: @modelFor('parent').get('slug')
}).then( (models) -> models.toArray() )
我认为我需要删除该路由并使评论嵌入 object 到游戏模型中。然后我只是用类似的东西替换插座:
{{#each comment in Game}}
<div class="commentItem">
<div class="commentItem-author">{{comment.parent_name}}</div>
<div class="commentItem-body">{{comment.body}}</div>
</div>
{{each}}
编辑
这是路由器:
App.Router.map(function() {
this.route('index', {
path: '/'
});
return this.resource('parent', {
path: '/:parent_id'
}, function() {
this.resource('games', {
path: '/games'
});
return this.resource('game', {
path: '/game/:game_id'
}, function() {
return this.resource('comments', {
path: '/comments'
});
});
});
});
假设您有当前的应用程序,并且大概在某处有一个游戏列表,例如:
{{#each games as |game|}}
<li>
{{#link-to 'game' game}}
{{game.title}}
{{/link-to}}
</li>
{{/each}}
您应该可以直接通过评论路由到游戏,方法是将您的 link- 更改为,如下所示:
{{#link-to 'games.game.comments' game}}
这里有一个twiddle有详细的解决方法
在游戏中嵌入评论就是答案。然后视图是这样的:
{{#each comment in model.comments}}
<div class="commentItem">
<div class="commentItem-author">{{comment.parent_name}}</div>
<div class="commentItem-body">{{comment.body}}</div>
</div>
{{/each}}