EmberJS - 如何重组嵌入式模型?

时间:2016-04-28 11:34:14

标签: ruby-on-rails ember.js ember.js-view

注意:使用Ember Rails 0.18.2和ember-source 1.12.1

我继承了一个具有奇怪功能的Ember应用程序。我是Ember的新手,所以这可能是正常的,但我觉得很奇怪。

有3种型号:

  1. 家长
  2. 游戏
  3. 评论
  4. 当家长观看游戏时,网址如下所示:

    /<parent slug>/games/<game_id>
    

    (slug只是父母的唯一ID。)

    在此网址上有一个包含以下代码的模板:

      {{#unless commentsOpen}}
      {{#link-to 'comments' class="Button easyButton"}}Chat with parents in your pod{{/link-to}}
      {{/unless}}
    
      {{outlet}}
    

    点击上面的按钮,然后将网址更改为:

    /<parent slug>/games/<game_id>/comments
    

    然后所有评论都出现在该游戏中。

    我需要从视图中删除该按钮,并为每个游戏自动显示评论。

    API是Rails,我可以更改API端点,以便在请求游戏的同时返回所有注释(作为嵌入的对象数组)。

    但是我应该用{{outlet}}替换什么?因为我的理解是{{outlet}}由于这条路线而被委托给评论模板:

    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() )
    

    我相信我需要删除该路线,并将评论作为游戏模型中的嵌入对象。我是否只需用以下内容替换插座:

    {{#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'
          });
        });
      });
    });
    

2 个答案:

答案 0 :(得分:1)

让我们说你有你当前的应用程序,大概就是你有一个喜欢的游戏列表:

{{#each games as |game|}}
  <li>
    {{#link-to 'game' game}}
       {{game.title}}
    {{/link-to}}
  </li>
{{/each}}

你应该可以通过更改链接来直接路由到带有评论的游戏,如下所示:

{{#link-to 'games.game.comments' game}}

这是一个带有详细解决方案的twiddle

答案 1 :(得分:0)

将评论嵌入游戏中就是答案。然后视图是这样的:

{{#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}}