2

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

  1. 使用其他对象的副作用:后端不仅会修改受影响的对象,还会修改相关对象。例如,服务文档的更新可能会影响队列。这是在后端完成的,ember 应用程序不知道这一点。
  2. 也许另一个用户在后端修改了对象,我想获得一个新的副本。

通常在访问路由时会加载对象#/nodes/index,但有时我想强制刷新商店,而不希望用户执行对正确路由的访问。如何以编程方式触发它?

4

1 回答 1

2

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

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

最简单的方法是使用 ember 方法,在钩子中返回数据model,并在钩子中获取 recordArray 实例afterModel。因此,使用此实例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 倍。

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

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

我在这里创建了一个示例。

于 2013-08-08T17:25:00.753 回答