Проблема с вашим подходом заключается в том, что помощник выполняется синхронно и не "наблюдает" за сервисом currentUser
таким образом, который бы пересчитывал. Было бы намного проще использовать вычисляемое свойство, чтобы делать то, что вы хотите:
controllers / application.js
currentUser: service(),
hasPermissionForUsers: computed("currentUser.user", function() {
const user = this.get("currentUser.user");
if (! user) return false;
return user.get("role") === "users"; // taking a random guess at what your helper does here
})
Это свойство теперь будет пересчитанокак только пользователь загружен:
application.hbs
{{#if hasPermissionForUsers}}
<li>{{#link-to 'users'}}<i class="fa fa-user"></i> <span>Clients</span>{{/link-to}}</li>
{{/if}}
Если вам нужно использовать помощника, это выполнимо, но это не красиво. Причина, по которой он не такой элегантный, заключается в том, что у помощников нет доступа к одному и тому же контексту, поэтому пересчитать сложнееВы можете сделать что-то вроде этого:
import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';
import { run } from '@ember/runloop';
import { addObserver, removeObserver } from '@ember/object/observers';
export default Helper.extend({
currentUser: service(),
willDestroy() {
this._super(...arguments);
const container = this.get('_container');
removeObserver(container, 'currentUser.user', this, this.update);
},
compute([feature, container]) {
addObserver(container, 'currentUser.user', this, this.update);
this.set('_container', container); // used for cleanup
const user = this.get('currentUser.user');
if (! user) return false;
return user.get('role') === feature;
},
update() {
run.once(this, this.recompute);
}
});
Затем использовать это так:
application.hbs
{{#if (permission-for "users" this)}}
<li>{{#link-to 'users'}}<i class="fa fa-user"></i> <span>Clients</span>{{/link-to}}</li>
{{/if}}