我使用mongo db的理智堆栈。我对emberjs很新。我正在使用ember 0.2.5并且航行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);
}
我搜索了一下,我没有看到这个直截了当的答案(或我理解的解决方案)。
由于
答案 0 :(得分:0)
Game
的模型定义已设置关系players: DS.hasMany('players')
,但未设置{ async: true }
。我假设您熟悉后果,并设置后端发送game
对象与嵌套players
关系。如果没有,我会稍后再说。
假设您的后端正在正确发送数据,您可以这样做:
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获取,但仅在明确需要时才能获取。因此,您必须更改逻辑以使用promises:
game.get('players').then(function(players) {
players.findBy('id', idYouHave).get("logo_url");
});
请记住,更改为async
是一个巨大的变化,在大型应用程序的情况下可能需要执行一些工作。您还需要更改API。但是,与不使用async
相比,它更直观,更易于维护。从长远来看,当你获得很多相关模型时,它会有更好的表现。