2012-07-12 3 views
15

backboneで実装されたWebアプリケーションを更新する方法を見つける必要があります。バックボーンモデル/ビューを更新するためのポーリングリクエスト

ユースケースは、次のようになります。
私はいくつかの変更を発見するための別の時間にサーバに異なるポーリング要求をするために、いくつかのビュー、および各ビュー、または多分このビューに関連したモデル/コレクション、 ニーズを持っています。
1:HTML5 web socket


PSを実装)Long Polling Request
3を実装)Traditional Polling Request
2を実装)

1:

私が最も一般的な方法は何であるか疑問に思って)サーバーはPHPで書かれています。
2)今のところ私はHTML5 WebSocketsを使用しないで解決策を探していますが、おそらくPHPがそれほど単純ではないためです。


Traditional Polling Requestを使用して私の簡単なコード(1)です。

(1)

// MyModel 
var MyModel = Backbone.View.extend({ 
    urlRoot: 'backendUrl' 
}); 

// MyView 
var MyView = Backbone.View.extend({ 

    initialize: function() { 
     this.model = new MyModel(); 
     this.model.fetch(); 
     this.model.on('change', this.render); 
     setTimeout(function() { 
      this.model.fetch(); 
     }, 1000 * 60 * 2); // in order to update the view each two minutes 
    } 
}); 

+0

asp.netを知っていれば、SignalRを調べることができます。クライアントとサーバとのやりとりが非常に簡単になり、ブラウザの機能によって自動的に適切な接続モデルが選択されます。 – Alexander

+0

websocket in php。著者による素早いハックを呼びました...まだ一見価値があるかもしれません。 http://code.google.com/p/phpwebsocket/source/browse/#svn%2Ftrunk%2F%20phpwebsocket –

+0

PHPでwebsocketをもっと有望:http://code.google.com/p/phpws/source/ /#git%2Fphpws –

答えて

18

この例を確認し、お使いのモデルにポーリングハンドラを、それを実装します。

// MyModel 
var MyModel = Backbone.Model.extend({ 
    urlRoot: 'backendUrl', 

    //Add this to your model: 
    longPolling : false, 
    intervalMinutes : 2, 
    initialize : function(){ 
    _.bindAll(this); 
    }, 
    startLongPolling : function(intervalMinutes){ 
    this.longPolling = true; 
    if(intervalMinutes){ 
     this.intervalMinutes = intervalMinutes; 
    } 
    this.executeLongPolling(); 
    }, 
    stopLongPolling : function(){ 
    this.longPolling = false; 
    }, 
    executeLongPolling : function(){ 
    this.fetch({success : this.onFetch}); 
    }, 
    onFetch : function() { 
    if(this.longPolling){ 
     setTimeout(this.executeLongPolling, 1000 * 60 * this.intervalMinutes); // in order to update the view each N minutes 
    } 
    } 
}); 

// MyView 
var MyView = Backbone.View.extend({ 

    initialize: function() { 
     this.model = new MyModel(); 
     this.model.startLongPolling(); 
     this.model.on('change', this.render); 
    } 
}); 
+0

範囲が偶数の場合でも曖昧です this.model.on( 'change'、this.render); //あいまいなスコープ - 私のケースはモデルのスコープでした this.model.on( 'change'、this.render、this); //スコープの範囲 – hharnisc

+0

@hharniscこれを初期化するときに使用したので、あいまいではありません。 "_.bindAll(this);" –

+0

これは実際に長いポーリングですか、それともその単語を使用していますか?長いポーリングでは、サーバーへの単一の接続を開き、応答を待つことが私の理解です。これはあなたが引き続きポーリングを行っているように見えます。 – Ziggy

11

私はあなたがここに求めているのかわからないんだけど、ここではいくつかの考えです:

1)あなたのコードは、あなたがした内容と矛盾するようですタイトルに書かれています。連続ポーリングにsetTimeout(またはsetInterval)を使用すると、長いポーリングとは異なるものになります。実際には(通常の)ポーリングです。違いは、長いポーリングクライアントがAJAXリクエストを開始し、彼が待機することです。サーバーはいつ応答するかを決定します。新しいデータが利用可能な場合にのみ対応する必要があります。そして、応答クライアントが新しいポーリング要求を開始した直後。

サイドノート:(比較的)効率的なロングポーリングサーバーを作成するのは簡単な作業ではありません。

2)あなたのコード内で何が起こっているかを知っている限り、クライアントサイド(ロングポーリングロジックを置く場所)をどのように処理するかは、実際問題ではありません。もちろん将来的にはコードにいくつかの変更を加えたいと思うかもしれないので、それを別々に保つことはおそらく最良の選択になるでしょう。

  • グローバルEventManagerオブジェクト(このスクリプトは最初にロードする必要があります)を作成する独立したスクリプトです。そのようなオブジェクトには、以下のメソッドがあります:.bind.triggerそして、それは...イベントを管理します。

Implementing events in my own object

  • ロングポーリングを扱う独立スクリプト::)ここでの実装は次のように見えるかもしれませんどのように例のためです。データがサーバから受信されると(すなわち、最後にAJAXの長いポーリングリクエストが終了します)、EventManager.trigger('long_polling_data', res);が呼び出されます。次に、あなたのバックボーンビュー内またはこの好きな場所でこのイベントにバインドする必要があります。

サイドノート:あなたが唯一の他の技術のためのロジックを実装する必要があります。このアーキテクチャでの追加ボーナスはあなたがWebSocketをまたは(JSONPポーリングなど)任意の他の技術への移行を決定した場合ということです。メインコードはlong_polling_dataイベントのみを使用するため、追加の変更は必要ありません(イベントの名前を変更することができます)。

3) WebSocketを使用したくないと言っても、私はこれについてコメントする必要があります。 :)世界は常に進化しています。あなたは長いポーリングテクニックについて忘れてはなりません。フォールバックとしてWebSocketsとXMLSocket(a.k.a.FlashSocket)を使用する方がはるかに効率的であり、サーバー側を実装する方がはるかに簡単です。

私はちょっと助けて欲しいと思いますが、あなたのプロジェクトで言語の間違いや幸運をおかけして申し訳ありません!

+1

あなたの応答に感謝します。私はロングポーリングからトラディショナルポーリングに私の質問のタイトルを変更しました。 –

+0

私の質問についてさらに詳しく述べました。多分webSocketをどうすれば使えるかという情報を私に与えることができます。ありがとう。 –

+0

申し訳ありませんが、私はPHP開発者ではありません。あなたがPythonやServer Side JavaScriptを学びたいと思わない限り。 :]私が今考えてみると、経験の浅い開発者が長いポーリングやウェブソケットを実装するのは少し難しいかもしれません。多くのリクエストをしない場合は、通常のポーリングも同様に機能するはずです。これは実際に実装するのが簡単です。単に 'setTimeout'を使うだけです。 – freakish

2

は、私はあなたが(そう単純ではないことに起因それに)PHPでWebSocketをを使用して見ていないことをあなたの質問での状態を知っていますしかし、私はそれが比較的簡単であることを発見しました。

  1. 私はhttp://pusher.com/を使用しました。これはフォールバックのあるWebソケットアプリです。 (私は途中で会社とつながっていない)。
  2. サーバ/ apiにhttps://github.com/squeeks/Pusher-PHPが含まれています
  3. クライアント側には<script src="http://js.pusherapp.com/1.12/pusher.min.js"></script>が含まれています。

クライアントとサーバーのチャネルは、Webソケットを使用して互いに話すように設定できます。

+0

お返事ありがとうございます。プッシャーPHPは非常に興味深いようです。 –

+0

プッシャーPHPは非常に面白いようですが、私はそれを支払う必要があります! –