强制重新加载索引

时间:2013-08-08 15:55:29

标签: ember.js

我的应用程序有一个nodes池和几个子节点(queuesservices,...)。我需要不断访问nodes池,我需要确保数据与后端数据保持同步。由于多种原因,后端中的数据可能会发生变化,例如:

  1. 使用其他对象的副作用:后端不仅会修改受影响的对象,还会修改相关对象。例如,服务文档的更新可能会影响队列。这是在后端完成的,而ember应用程序并不知道这一点。
  2. 也许其他用户在后端修改了对象,我希望得到一份新的副本。
  3. 通常在访问路由#/nodes/index时会加载对象,但有时我想强制刷新商店,而不希望用户执行对正确路径的访问。我该如何以编程方式触发?

1 个答案:

答案 0 :(得分:2)

使用ember数据,您可以使用重新加载数据。 recordArray.update(),并使用window.setInterval安排到您想要的时间。解析RecordArray时会获得Model.find()个实例。

Model.find().then(function(recordArray) {
});

执行此操作的简单方法是以ember方式,在model挂钩中返回数据,并在afterModel挂钩中获取recordArray实例。因此,使用此实例可以使用update在某个特定时间执行setInverval,例如:

App.NodesIndexRoute = Ember.Route.extend({
  model: function() {
    return App.Nodes.find();
  },
  afterModel: function(recordArray) {
    setInterval(function() {
      recordArray.update();
    }, 1000); //each second
  }
});

请注意转换到节点索引路由,因为每次都会创建一个新的setInterval,并且每次转换到该路由时会加载n次。

要解决此问题,请存储setInterval返回的ID,然后使用clearInterval删除上一个任务:

afterModel: function() {
    if (this.get('jobId')) {
      clearInterval(jobId);
    }
    var jobId = setInterval(function() {
      record.update()
    }, 1000); // each second
    this.set('jobId', jobId);
}

我创建了一个示例here