0

バックボーンを使用して、JSON API から毎日のイベントを取得し、JSON の変更を定期的にチェックして、それらの変更を再レンダリングしようとしています。また、アプリは長時間実行されるため、定期的に日付をチェックします。日付が変更されると、コレクションの URL も変更され、コレクションが再取得および再レンダリングされます。

ただし、データを再フェッチすると (データが変更されているか、完全に新しいデータであるかに関係なく) --- モデルまたはコレクションで変更イベントが発生しません。

コードを貼り付けることもできますが、次のように単純に質問するだけで時間を節約できます。

新しい/変更されたデータについてサーバーをポーリングし、ビューでモデルを追加/削除/更新するプロセスはどのようなものですか? サーバーに書き込む必要はありません。コンテンツをプルするだけで、変更を 30 秒間ポーリングするだけです。

それって同期になるの?フェッチ?

これに関するメソッドを Web で検索しましたが、バックボーン API が継続的に変更されているため、これまで実行可能な解決策を見つけることができませんでした。

ご協力いただきありがとうございます!

4

3 に答える 3

2

まず第一に: バックボーン自体には、API からデータを「定期的に」フェッチする方法がありません。JavaScript を使用して処理する必要があります。

それぞれの質問に答える:

Q. サーバーをポーリングして新規/変更されたデータを取得し、ビューでモデルを追加/削除/更新するプロセスはどのようなものですか? A. 上で述べたように、次のような JS を介して処理する必要があります。

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

Q. サーバーに書き込む必要はありません。コンテンツをプルするだけで、変更を 30 秒間ポーリングするだけです。それは同期になりますか? フェッチ?

A. バックボーン fetch メソッドが適切だと思います。

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

backbone-pollerは backboneの優れた実装のようです。

于 2014-01-28T15:47:42.200 に答える