Ember 2.x DS和关系更新

时间:2016-03-14 22:46:35

标签: javascript ember.js

我有一个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合作或建议重新加载所有内容。

2 个答案:

答案 0 :(得分:1)

根据文档 - " findAll要求适配器的findAll方法查找给定类型的记录,并返回一个服务器返回值后将解析的promise。承诺将解析为商店中存在的此类型的所有记录,即使服务器仅返回其中的一部分。"

你可以试试像:

return this.store.findAll('servers').then(function(servers){
   return servers;
  });

答案 1 :(得分:0)

我通过使用更好的代码架构解决了我的问题。

我无法发布任何代码示例,因为我改变了很多东西。我所能说的就是我现在正在使用一个执行findAll请求的服务,并为我的vars提供了一些计算属性和观察器。

我在每个需要使用获取数据或计算值的组件中注入此服务。现在一切都很好。