make ember在加载时解决hasMany关系

时间:2014-04-15 12:16:01

标签: javascript ember.js ember-data

我目前正面临很多问题。我正在使用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属性中执行。

问题是如何在渲染视图之前解决帐户的子项?

2 个答案:

答案 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对象非常方便。它允许我们在渲染过程之后更改属性的值,使视图根据您刚刚设置的新值进行更新 因为它会更新视图,所以您不必再关心模型是否已解决。

我希望这对人们有所帮助。