私には2つのモデルがAdmin
あり、User
私のアプリケーションテンプレートは次のとおりです
//application.hbs
{{outlet}}
{{header-nav}}
{{header-nav}}
カスタマイズ可能にするために(可能であれば)やりたいことは
次のとおりadmin
です。動的にレンダリングするものを構築するにはどうすればよいですか?{{admin-header}}
user
{{user-header}}
application.hbs
私には2つのモデルがAdmin
あり、User
私のアプリケーションテンプレートは次のとおりです
//application.hbs
{{outlet}}
{{header-nav}}
{{header-nav}}
カスタマイズ可能にするために(可能であれば)やりたいことは
次のとおりadmin
です。動的にレンダリングするものを構築するにはどうすればよいですか?{{admin-header}}
user
{{user-header}}
application.hbs
isAdmin
Application Controller で計算されたプロパティを定義できます。
// application controller
isAdmin: Ember.computed(function() {
// your logic here
})
// application template
{{#if isAdmin}}
{{admin-header}}
{{else}}
{{user-admin}}
{{/if}}
または、プロパティを持つheader-nav
コンポーネントとしてラップすることもできます。isAdmin
// application template
{{header-nav isAdmin=isAdmin}}
更新 (@Grimmy の ember-simple-auth で詳細)
1) に注入currentUser
しますsession
(例: https://stackoverflow.com/a/30894082/4950029 )
2)フックで解決currentUser
し、コントローラーのプロパティを設定します。beforeModel
currentUser
//route
beforeModel: function() {
var self = this;
this.session.get('currentUser').then(function(user) {
self.controllerFor( self.routeName ).set('currentUser', user);
},function() {
self.controllerFor( self.routeName ).set('currentUser', null);
});
}
//controller
isAdmin: Ember.computed('currentUser.role', function() {
return (this.get('currentUser.role') === 'admin');
}),
//template
{{#if isAdmin}}
{{admin-header}}
{{else}}
{{user-admin}}
{{/if}}
または上で答えたように
//controller
roleBasedComponentName: Ember.computed('currentUser.role', function() {
return ((this.get('currentUser.role') === 'admin') ? 'admin-header' : 'user-header');
})
//template
{{component roleBasedComponentName user=currentUser}}
ヘルパーを使用することもでき{{component}}
ますが、最初にコンポーネント名を決定する必要があるため、コントローラーで次のようにします。
nameForComponent: Ember.computed('user.isAdmin', function() {
// if admin return admin-header else user-header
})
次に、テンプレートで次のようにします。
{{component nameForComponent}}
このようなユースケースのために、少し前に設計および導入されました。
さらに派手にすることもできます:
{{component (if user.isAdmin 'admin-header' 'user-header') }}