ember - 根据用户/模型属性设置控制器属性?

时间:2016-09-09 02:48:04

标签: ember.js

我在根据用户属性为控制器设置属性时遇到了一些麻烦。现在我有一个简单的设置,用户可以成为一个组的管理员。我想这样做,如果用户是一个组的管理员,当他们转到该组的组/显示页面时,有一个表单为该组创建帖子,但这不会显示给普通成员谁不是管理员。

现在我的控制器看起来像这样:

import Ember from 'ember';

export default Ember.Controller.extend({

    loggedInUser: Ember.inject.service('user'),

  isAdmin: Ember.computed(function() {
        var that = this;

        //getting the current user and the list of groups they are
        //the admin of
        this.get('loggedInUser').get('currentUser.administrating')
            .then(function(groups) {

                //getting the id of the current group
                var groupID = that.get('group').get('id');

                    //looping over each group the user is an admin of
                    //and comparing the id to the current groups id
                    groups.forEach(function(group) {
                        if (group.get('id') == groupID) {
                            that.set('isAdmin', true);
                        } 
                    })
            });
    })


});

问题是这只能在第一次使用。例如,如果用户访问某个组的组/显示页面,并且该组是该组的管理员,则它将显示该表单。但是,在进一步访问其他组的其他组/显示页面时,它将显示该表单,即使该用户不是该组的管理员。我做了一些挖掘,看起来问题是控制器是一个单独的,并在导航到其他页面时持续存在。我在路由中使用setupControllerisAdmin设置为false,但是每次都将该属性设置为false。有没有正确的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

如注释中提到的@torazaburo,计算属性必须具有依赖键。没有它,它将不会在用户更改时重新计算。

这部分代码

groups.forEach(function(group) {
  if (group.get('id') == groupID) {
    that.set('isAdmin', true);
  } 
})

应该看起来像这样

groups.forEach(function(group) {
  if (group.get('id') === groupID) {
    return true;
  } 
});
return false;

如果用户在组/节目页面中不会改变,另一种方法是简单地从setupcontroller调用控制器函数并从那里设置isAdmin

//routes/groups/show.js
...
setupController(controller, model) {
this._super(controller, model);
controller.setAdmin();
...

//controllers/groups/show.js
...
isAdmin: false,
setAdmin() {
var that = this;

    //getting the current user and the list of groups they are
    //the admin of
    this.get('loggedInUser').get('currentUser.administrating')
        .then(function(groups) {

            //getting the id of the current group
            var groupID = that.get('group').get('id');

                //looping over each group the user is an admin of
                //and comparing the id to the current groups id
                groups.forEach(function(group) {
                    if (group.get('id') == groupID) {
                        that.set('isAdmin', true);
                        return;
                    } 
                });
                this.set('isAdmin', false);

        });
}