此刻我真的很困惑,而且修复它可能很简单。
我有两个模型,相互关联:
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');
在我的控制台中,我可以清楚地看到对象存在且相关。
答案 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}
条件,并且问题中的两个表达式都应该按预期工作。