我有一个Ember 2.x网络应用,需要通过hasMany关系获取数据:许多"网站"有很多"服务器"和许多"客户"。
//Site model
export default DS.Model.extend({
name: DS.attr('string', {defaultValue: ''}),
servers: DS.hasMany('server'),
clients: DS.hasMany('client')
})
//Server model
export default DS.Model.extend({
ip: DS.attr('string', {defaultValue: '0.0.0.0'})
alive: DS.attr('boolean'),
site: DS.belongsTo('site')
})
//Client model
export default DS.Model.extend({
ip: DS.attr('string', {defaultValue: '0.0.0.0'})
alive: DS.attr('boolean'),
sites: DS.hasMany('site')
});
要获取我的内容,我会这样做:
model() {
return this.store.findAll('client').then(() => {
console.info('clients : OK');
return this.store.findAll('server');
}).then(() => {
console.info('servers : OK');
return this.store.findAll('site');
}).then((sites) => {
console.info('sites : OK');
return sites;
});
}
那,好的,所有内容都已下载并按预期显示在屏幕上。
我的应用程序有一个Socket.IO客户端收到一些简单的通知,告诉它应该重新加载所有"服务器" (因为" alive"值已更新)。所以我只是执行一个findAll('服务器'),因为我只想更新服务器:
this.socket.on('reload-servers', () => {
that.store.findAll('servers');
});
Chrome的Ember数据检查员使用新值进行更新,但不会更新我的"网站"网页中的内容。
我的问题是:为什么?我认为解决方案并不像我预期的那样神奇,但经过数小时的研究,我仍然无法做到。
我不确定这是不正确的做法。我在谷歌上尝试了很多搜索,但只找到了Ember 1的例子,这些例子不会与Ember 2合作或建议重新加载所有内容。
答案 0 :(得分:1)
根据文档 - " findAll要求适配器的findAll方法查找给定类型的记录,并返回一个服务器返回值后将解析的promise。承诺将解析为商店中存在的此类型的所有记录,即使服务器仅返回其中的一部分。"
你可以试试像:
return this.store.findAll('servers').then(function(servers){
return servers;
});
答案 1 :(得分:0)
我通过使用更好的代码架构解决了我的问题。
我无法发布任何代码示例,因为我改变了很多东西。我所能说的就是我现在正在使用一个执行findAll请求的服务,并为我的vars提供了一些计算属性和观察器。
我在每个需要使用获取数据或计算值的组件中注入此服务。现在一切都很好。