我目前正在加载一些在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.js
是model()
,强制session.isAuthenticated
true
方法重新运行(并等到承诺返回)?
ember:2.5.x,ember-data:2.5.x
答案 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);
}
});