【问题标题】:Ember.js dynamic componentsEmber.js 动态组件
【发布时间】:2015-08-31 22:38:30
【问题描述】:

我有两个模型 AdminUser 我的申请模板如下

//application.hbs
{{outlet}}
{{header-nav}}

我想做什么(如果可能的话)使{{header-nav}} 可定制,我解释说: 如果admin 验证我想渲染组件{{admin-header}}user 验证的情况下,它应该呈现{{user-header}}。 如何动态构建要在application.hbs 中呈现的内容?

【问题讨论】:

    标签: javascript ember.js handlebars.js htmlbars


    【解决方案1】:

    您可以在应用程序控制器中定义isAdmin 计算属性:

    // application controller 
    isAdmin: Ember.computed(function() {
      // your logic here
    })
    
    // application template
    {{#if isAdmin}}
      {{admin-header}}
    {{else}}
      {{user-admin}}
    {{/if}}
    

    或者您可以将其包装为带有isAdmin 属性的header-nav 组件,所以:

    // application template
    {{header-nav isAdmin=isAdmin}}
    

    更新 (@Grimmy 的 ember-simple-auth 的详细信息)

    1) 将currentUser 注入session(例如https://stackoverflow.com/a/30894082/4950029

    2) 在beforeModel钩子中解析currentUser并设置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}}
    

    【讨论】:

    • 你能给我一个控制器的完整例子吗?
    • 您想看一些特别的东西吗?
    • 使用ember-simple-auth进行认证,想获取当前user.role来决定渲染哪个视图
    • 在路由中,“nil”是什么意思?
    • 我正在使用 ember-simple-auth 0.7.3,我尝试了您的解决方案我收到了这个错误:“处理路由时出错:索引”“this.session.get(...) is undefined" "beforeModel@localhost:4200,有什么想法吗?(再次打扰您)
    【解决方案2】:

    您可以使用{{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') }} 
    

    【讨论】:

    • 很抱歉我迟到了,我感谢您的回答,nameForComponent 我应该在哪个控制器中定义它(我是 Ember 新手)
    • 在应用程序控制器或headernav组件中,取决于您使用组件助手的模板。
    • 好的,你能给我一个应该返回nameForComponent的例子吗,知道我正在使用Ember-simple-auth进行身份验证,并且在我的用户中我有一个角色属性,它可以采用“管理员”或“用户”
    • nameForComponent 应该返回组件名称 - 字符串 admin-headeruser-header
    • 最后一个问题,使用 ember-simple-auth 获取当前用户(角色)的最佳方法是什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多