在ember-simple-auth身份验证后加载application.js的Ember数据模型

时间:2016-06-02 23:04:05

标签: ember.js ember-data

我目前正在加载一些在routes/application.js路线的网站范围内使用的余烬数据。然后可以在任何地方访问该数据。特别是,数据将从templates/application.hbs模板传递到组件,并且store.peekAll()可以从其他各个位置访问。

这是否是正确的方法(我欢迎对此提出反馈!),这对我有用,除了以下情况:

如果用户未经过身份验证,我无法查询数据,因为他们尚未获得查看权限。这是我的代码:

// routes/application.js
import Ember from 'ember';

export default Ember.Route.extend(ApplicationRouteMixin, {
  model() {
    if (this.get('session.isAuthenticated')) {
      return Ember.RSVP.hash({
        clients: this.store.findAll('client', {include: 'projects'}),
        resources: this.store.findAll('resource')
      });
    }
  }
});

我想在验证后加载数据,但我不知道如何重新加载模型。如果我只是在sessionAuthenticated挂钩中加载了数据,如下所示:

// routes/application.js
sessionAuthenticated() {
  this.controller.set('clients', this.store.findAll('client', {include: 'projects'}));
  this._super(...arguments);
}

它不起作用。 store填充了数据,但依赖于此数据的组件永远不会看到它。此外,由于同步性,我转换到下一个的路径(也取决于数据)没有及时。

必须有一个简单的方法来做到这一点,但我很困惑它是什么。观察员?现在routes/application.jsmodel(),强制session.isAuthenticated true方法重新运行(并等到承诺返回)?

ember:2.5.x,ember-data:2.5.x

2 个答案:

答案 0 :(得分:1)

我按如下方式实施了服务:

// services/lime-core.js
import Ember from 'ember';

export default Ember.Service.extend({
  store: Ember.inject.service(),
  resources: null,
  clients: null,

  init() {
    this.set('resources', []);
    this.set('clients', []);

    this.get('store').findAll('resource').then(resources => {
      this.set('resources', resources);
    });
    this.get('store').findAll('client', {include: 'projects'}).then(clients => {
      this.set('clients', clients);
    });
  }
});

然后我可以在模板中访问limeCore服务,只要它被注入:

// components/foo/component.js
export Ember.Component.extend({
  limeCore: Ember.Service.inject(),
  ...
}

和我的模板:

// components/foo/template.hbs
<ul>
  {{#each limeCore.resources as |resource|}}
    <li>{{resource.name}}</li>
  {{/each}}
</ul>

答案 1 :(得分:0)

试试这个:

// routes/application.js
import Ember from 'ember';

export default Ember.Route.extend(ApplicationRouteMixin, {
  model() {
    if (this.get('session.isAuthenticated')) {
      return Ember.RSVP.hash({
        clients: this.store.findAll('client', {include: 'projects'}),
        resources: this.store.findAll('resource')
      });
    }
    return {};
  },
  sessionAuthenticated() {
    this.store.findAll('client', {include: 'projects'}).then(clients => {
      this.controller.set('model.clients', clients);
    });

    this._super(...arguments);
  }
});