【问题标题】:Ember model with session data带有会话数据的 Ember 模型
【发布时间】:2015-08-20 08:56:21
【问题描述】:

当我想在模型中使用会话数据(分配给用户的公司 ID)时,我遇到了 ember 问题。我正在使用带有 ember-simple-auth 的 ember-cli 和 ember 0.13.1。假设当我想显示有关用户被分配到的公司的信息时,我有一个名为 user/profile 的路由。为此,我需要从会话中检索分配给用户的 companyId,并使用模型调用我的 API。目前用户/个人资料的路线如下所示:

import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
    model: function() {
        return Ember.RSVP.hash({
                industries: this.store.findAll('industry'),
                industryroles: this.store.findAll('industryrole'),
                company: this.store.find('company',this.session.get('user.companyId'))
        });
    },
    setupController: function(controller, model) {
      controller.set('industries', model.industries);
            controller.set('industryroles', model.industryroles);
      controller.set('company', model.company);
  }
});

当您从不同的路线前往该路线时,一切正常,但是当您处于用户/个人资料路线并按 F5 时,this.session.get('user.companyId') 未定义。

有人知道我该如何解决这个问题吗?

最好的问候 帕维尔

【问题讨论】:

  • 如果用户只能访问他们的公司,您可以在后端解决这个问题:确定用户在请求信息并返回他们的公司。
  • 感谢您的回答,但我不想在后端执行此操作,因为我在其他路由中也使用相同的请求。我想知道是否应该将会话注入模型,但我在 simple-auth 论坛中发现这不是建议的方法。另一件事是我用一个承诺注册了一个用户,这意味着来自用户/配置文件路由的模型将在该承诺解决后执行。

标签: session ember.js model ember-simple-auth ember-model


【解决方案1】:

您似乎需要查看 session.content 设置(当然,如果您没有在用户/配置文件路由中覆盖 beforeModel 挂钩)。

如果您的情况有两步数据获取,您需要在用户/配置文件模型挂钩中等待会话数据,然后才能获取 user.companyId。

【讨论】:

  • 我已经发布了我的解决方案,但它不能正常工作。我找不到等待在 beforeModel 中设置会话的解决方案。你能给我一些例子吗?我该怎么做?谢谢!
【解决方案2】:

我想出了一些解决方案。我在用户/配置文件的路由中为 session.user.companyId 设置了一个观察者。所以目前我的路线是这样的:

//app/routes/user/profile.js
import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
    onSessionIsAuthenticated: function () {
    var isAuthenticated = this.get('session.isAuthenticated');
    if (!isAuthenticated) {
      return false;
    }
        var _this = this;
    return Ember.RSVP.hash({
      company: _this.store.find('company',this.get('session.user.companyId')).then(function (data) {
        _this.controllerFor('user.profile').set('company', data);
      })
    });
  }.observes('session.user.companyId'),
    model: function() {
        return Ember.RSVP.hash({
                industries: this.store.findAll('industry'),
                industryroles: this.store.findAll('industryrole')
        });
    },
    setupController: function(controller, model) {
      controller.set('industries', model.industries);
            controller.set('industryroles', model.industryroles);
  }
});

其余行业和行业角色仍留在控制器中。现在一切似乎都正确,但我不确定这是否是解决此问题的正确方法。我不确定这是否是您的想法@Microfed?

【讨论】:

    【解决方案3】:

    如果有人仍在为上述问题而苦苦挣扎。这是解决方案:

    import Ember from 'ember';
    import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';
    
    export default Ember.Route.extend(AuthenticatedRouteMixin, {
        model: function() {
            return Ember.RSVP.hash({
                    industries: this.store.findAll('industry'),
                    industryroles: this.store.findAll('industryrole'),
                    company: this.store.find('company', this.get('session.data.user.companyId'))
            });
        },
        setupController: function(controller, model) {
          controller.set('industries', model.industries);
                controller.set('industryroles', model.industryroles);
          controller.set('company', model.company);
      }
    });
    

    【讨论】:

    • 建议:尝试controller.setProperties(model)而不是单独设置。
    • 这并不能解决问题。问题是调用模型钩子时会话数据尚未解决。您似乎刚刚更改了会话数据的引用方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多