【问题标题】:Ember js access different model data from templateEmber js从模板访问不同的模型数据
【发布时间】:2015-08-06 10:38:09
【问题描述】:

我正在使用 mongo db 的健全堆栈。我对 emberjs 还很陌生。我正在使用 ember 0.2.5 和sails 0.11.0 和 mongodb。

我有一个可以从游戏模板正确访问的游戏路线、控制器和模型。我还有一个单独的玩家路线、控制器、模型、模板设置,我也可以正确访问和操作。

一个游戏有两个玩家,玩家有一个标志。鉴于我有包含每个玩家 ID 的游戏数据,我基本上想使用玩家 ID 获取玩家徽标并将其显示在游戏模板中。

我尝试了一些东西,这是我最后一次尝试将这个逻辑放入游戏控制器中。

//model/game.js

import DS from 'ember-data';

export default DS.Model.extend({
    home_player: DS.attr('string'),
    away_player: DS.attr('string'),
    players: DS.hasMany('players'),
});



//Here's the logic of what I want to achieve

playerLogo: function(playerName){
  for (player in players) 
    if player.name == playerName
    return player.logo_url);
}

我进行了一些搜索,但没有看到直接的答案(或我理解的解决方案)。

谢谢

【问题讨论】:

    标签: javascript mongodb ember.js


    【解决方案1】:

    Game 的模型定义已设置关系 players: DS.hasMany('players'),但未设置 { async: true }。我假设您熟悉后果并且您将后端设置为发送具有嵌套players 关系的game 对象。如果没有,我稍后再回复。

    假设您的后端正确发送数据,您可以这样做:

    game.get('players').findBy('id', idYouHave).get("logo_url"); # you can find by 'name' also
    

    记住在使用 Ember/DS 对象时始终使用 #set#get。您不能直接查询或设置属性。

    好的,但是如果这不是问题,而是您在不知道async 的含义的情况下定义了关系,那么让我们来看看。 async 表示 Ember 应该在需要时通过 id 获取相关模型。因此,您从后端得到的只是game 对象和player_ids 表(例如player_ids: [1, 2])。这些相关的播放器最初是不可访问的——它们仍然需要被 ember 获取,但只有在明确需要时。因此,您必须更改逻辑以使用 Promise:

    game.get('players').then(function(players) { 
      players.findBy('id', idYouHave).get("logo_url");
    });
    

    但请记住,更改为 async 是一个巨大的变化,在大型应用程序的情况下可能需要一些工作才能执行。您还需要更改您的 API。但是,它比不使用async 更直观,更易于维护。从长远来看,当您获得大量相关模型时,它具有更好的性能。

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多