Ember js从模板访问不同的模型数据

时间:2015-05-25 01:05:05

标签: javascript mongodb ember.js

我使用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);
}

我搜索了一下,我没有看到这个直截了当的答案(或我理解的解决方案)。

由于

1 个答案:

答案 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相比,它更直观,更易于维护。从长远来看,当你获得很多相关模型时,它会有更好的表现。