我在根据用户属性为控制器设置属性时遇到了一些麻烦。现在我有一个简单的设置,用户可以成为一个组的管理员。我想这样做,如果用户是一个组的管理员,当他们转到该组的组/显示页面时,有一个表单为该组创建帖子,但这不会显示给普通成员谁不是管理员。
现在我的控制器看起来像这样:
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);
}
})
});
})
});
问题是这只能在第一次使用。例如,如果用户访问某个组的组/显示页面,并且该组是该组的管理员,则它将显示该表单。但是,在进一步访问其他组的其他组/显示页面时,它将显示该表单,即使该用户不是该组的管理员。我做了一些挖掘,看起来问题是控制器是一个单独的,并在导航到其他页面时持续存在。我在路由中使用setupController
将isAdmin
设置为false,但是每次都将该属性设置为false。有没有正确的方法来做到这一点?
答案 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);
});
}