如何获取模型的名称属性?

时间:2014-08-25 20:01:14

标签: ember.js model belongs-to

此刻我真的很困惑,而且修复它可能很简单。

我有两个模型,相互关联:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  zip_code: DS.attr('string'),
  address_line: DS.attr('string'),
  country: DS.attr('string'),
  active: DS.attr('boolean'),
  state: DS.attr('string'),
  comments: DS.attr('string'),
  user_type: DS.belongsTo('user_type', { async: true })
});

App.UserType = DS.Model.extend({
  name: DS.attr('string'),
  users: DS.hasMany('users', { async: true })
});

我正在尝试User UserType.name

足够简单吧?错!

// Doesn't work.
user.get('user_type.name');

// Also doesn't work.
user.get('user_type').get('name');

在我的控制台中,我可以清楚地看到对象存在且相关。

enter image description here

2 个答案:

答案 0 :(得分:1)

您可能需要"解决" UserType:

user.get('user_type').then(function(userType) {
    console.log("User type is:", userType.get('name'));
});

请注意,这会为您的方法带来异步性......根据您尝试做的事情,您需要适应这种情况。通常,当绑定到Handlebars模板时,相关类型的这种解析会自动发生,因此您应该能够(在模板中)使用{{user.user_type.name}}

答案 1 :(得分:1)

因为您已将关系设置为{async: true},所以Ember假定关系是异步的,即它需要单独加载UserType模型。因此,至少在它第一次调用时,user.get('user_type')实际上会返回一个承诺,在调用链式方法的时候,它不能保证加载内容。

即使它已经在商店中,(如果内存服务),Ember也不会尝试将其设置到下一个运行循环。因此,立即致电.get('name')即可为您提供null

user.get('user_type.name')语法将在内部解析为与user.get('user_type').get('name')相同的内容,因此结果不会有所不同。

Steve H。的回应应该有效。或者,如果您正在使用服务器(而不是固定装置)并且服务器响应是userType与用户一起负载 - 或者如果您有能力更改响应 - 您应该是能够删除{async: true}条件,并且问题中的两个表达式都应该按预期工作。