0

我正在尝试使用 Backbone 从 JSON API 中提取日常事件,并定期检查 JSON 中的更改 - 并重新呈现这些更改。此外 - 该应用程序将长时间运行,因此我将定期检查日期 - 这样当日期更改时,集合的 URL 也会重新获取并重新呈现集合。

但是,当我重新获取数据(无论是已修改还是完全是新数据)时,它不会触发模型或集合上的任何更改事件。

我可以粘贴我的代码 - 但只需简单地询问可能会节省时间:

轮询服务器以获取新的/修改的数据,然后在视图上添加/删除/更新模型的过程是什么?我不需要对服务器进行任何写入,只需提取内容 - 并且每 30 秒轮询一次以进行更改。

那会是同步吗?拿来?

我已经在网上搜索了这方面的方法——但是随着 Backbone API 的不断变化——到目前为止,我还没有找到可行的解决方案。

谢谢你的帮助!

4

3 回答 3

2

首先:Backbone 本身没有“定期”从 API 获取数据的方法。您需要使用 JavaScript 来处理它

回答您的每个问题:

问:轮询服务器以获取新的/修改的数据,然后在视图上添加/删除/更新模型的过程是什么?A. 如上所述,您需要通过 JS 处理它,执行类似的操作

setInterval(function(){
//Make an API call to get data
},30000);

问:我不需要对服务器进行任何写入,只需拉取内容 - 并每 30 秒轮询一次更改。那会是同步吗?拿来?

A. 我说骨干提取方法是合适的。

每 30 秒调用一次 API:

setInterval(function(){
  collection.fetch();
},30000);

收听获取完成并重新渲染您的视图

collection.on('reset',this.render(),this);

希望这能简要回答您的问题。

谢谢

于 2013-08-01T18:11:05.007 回答
1

简单地说,每个Backbone组件都可以listenTotrigger事件。有很多内置事件,但没有什么能阻止你实现自己的。

这是针对您的问题的纯事件驱动的实现解决方案。这具有易于扩展的优点,如果您的应用程序中每 30 秒需要发生其他任何事情,只需注册一个回调到正确的事件即可。

var Data = Backbone.Collection.extend({
  initialize: function() {
    this.listenTo( Backbone, 'tick:30secs', this.fetch, this );
    return this;
  },
  // Example date-dependent url.
  url : function() {
    var date = new Date(); 
    return 'http://server.com/api/' + date.getFullYear() + '-' + date.getDay();
  }
});

var View = Backbone.View.extend({
  // Assuming you store your template in the HTML page.
  template: _.template($('#view-template')),
  initialize: function() {
    this.listenTo( this.collection, 'reset change add', this.render, this );
    setInterval(function() { Backbone.trigger('tick:30secs'); }, 30000);
    return this;
  },
  render: function() {
    this.$el.html( this.template(this.collection.toJSON) );
    return this;
  }
});

// Start everything up.
var collection = new Data(),
    view = new View({ collection: collection });
$('body').append( view.el );
collection.fetch();
于 2013-08-01T23:37:52.293 回答
1

主干轮询器似乎是主干的一个很好的实现。

于 2014-01-28T15:47:42.200 回答