我目前正面临很多问题。我正在使用ember simple-auth插件,它为我提供了可通过代码或模板访问的会话对象。该会话对象存储帐户信息,例如用户名,ID和权限。
我的模特是这样的:
App.Right = DS.Model.extend({
label: DS.attr('string', { defaultValue: undefined })
});
App.Right.FIXTURES = [
{
id: 1,
label: 'Admin'
}, {
id: 2,
label: 'Manager'
}, {
id: 3,
label: 'User'
}
];
App.User = DS.Model.extend({
username: DS.attr('string'),
rights: DS.hasMany('right', {async: true})
});
App.User.FIXTURES = [
{
id: 1,
username: "Someone",
rights: [1]
}
];
然后我(在simple-auth文档中指定)这个设置:
App.initializer({
name: 'authentication',
initialize: function(container, application) {
Ember.SimpleAuth.Session.reopen({
account: function() {
var userId = this.get('userId');
if (!Ember.isEmpty(userId)) {
return container.lookup('store:main').find('user', userId);
}
}.property('userId')
});
...
}
});
在我的观点中,我正在这样做:
this.get('context.session.account.rights').toArray()
但它给了我一个空数组。这段代码在Ember.computed
属性中执行。
问题是如何在渲染视图之前解决帐户的子项?
答案 0 :(得分:0)
由于async:true this.get('context.session.account.rights')将返回一个promise对象,因此你必须使用this.get('context.session.account.rights')。然后(。 ..见:http://emberjs.com/api/classes/Ember.RSVP.Promise.html#method_then
答案 1 :(得分:0)
好的,所以我终于开始工作了。它没有解决原始问题,因为原始问题完全是愚蠢的。使用async: true
时,同步解决关系是不可能的。试图提前解决它不是解决方案,因为你仍然不知道它何时实际解决了。
所以这是解决方案:
$.each(this.get('cellContent.buttonList'), function(i, button) {
button.set('hasAccess', false);
this.get('context.session.account').then(function(res) {
res.get('rights').then(function(result) {
button.set('hasAccess', Utils.hasAccess(result.toArray(), button.rights));
});
});
});
使用以下cellContent.buttonList
定义:
buttonList: [
Ember.Object.create({
route: 'order',
label: 'Consult',
rights: 'all'
}), Ember.Object.create({
route: 'order.edit',
label: 'Edit',
rights: [1, 2]
})
]
<强>解释强>
我们必须使用Ember.Object
才能访问set
方法。使用Ember对象非常方便。它允许我们在渲染过程之后更改属性的值,使视图根据您刚刚设置的新值进行更新
因为它会更新视图,所以您不必再关心模型是否已解决。
我希望这对人们有所帮助。