2017-05-27 10 views
1
$scope.receivefb = function receivefb(){ 
    var url ="js/db.php"; 
    $http.post(url).success(
     function(data){ 
     console.log(data); 
     if(data.msg!=""){ 
    document.getElementById('messages').innerHTML += '<div class="row message-body"><div class="col-sm-12 message-main-receiver"><div class="receiver"><div class="message-text" name="messaggio" id='+data.id+'>'+data.msg+'</div><span class="message-time pull-right">Sun</span></div></div></div>'; 

      } 
      $timeout($scope.receivefb, 2000); 

     }) 


} 

私はこのjavascript関数を使用して、2秒ごとにdbから最後のメッセージを取得したスクリプトを呼び出してから印刷します。私はこのタイムアウトのものを使用しないで、代わりに、私は常に新しいメッセージが検出されるたびに私のjavascriptをリッスンしトリガするような種類のスクリプトを使用したい。 概念はかなりシンプルですが、私はこの問題を解決する方法を知らない。サーバからのメッセージをプルしてクライアント側でレンダリングする

+2

<div ng-controller="MessagesController"> <div ng-repeat="message in messages" class="row message-body"> <div class="col-sm-12 message-main-receiver"> <div class="receiver"> <div class="message-text" name="messaggio" id="{{message.id}}"> {{message.msg}} </div> <span class="message-time pull-right">Sun</span> </div> </div> </div> </div> 
[WebSocketを(https://developer.mozilla.org/en-US/docs/Web/API/WebSocke ts_API)。 – Siguza

答えて

1

実際、サーバーへのリクエストをしないと新しいメッセージが存在するかどうかを検出できません。また、サーバーはクライアント側にいくつかのWebソケットまたは「Webソケット類似」テクノロジを介して通知します。

少なくとも2つの解決策があります。

1)使用して、サーバーサイドのWebソケットアプリを開発し、いくつかのメッセージイベントに結合し、$scope.messages配列に新しいメッセージを入れて、角度にロジックをレンダリング委任socket.io。利点は、それがイベントベースで動作し、それが "リアルタイム性"を持っていることです。あなたはnodejsを学び、nodejsサーバ(簡単な安いランプサーバホスティングにはnodejsサポートがないかもしれません)を持っています。

2)それとも、単に描画ロジックとは別に、メッセージごとに2秒をポーリングを維持し、$scope.messagesに新しいメッセージを入れ、(ng-repeat tutorialsを見る)角度に描画ロジック委任:

JSの部分()MessagesControllerの内部:

$scope.messages = []; 
function receivefb(scope) { 
    var url ="js/db.php"; 
    $http 
    .post(url) 
    .success(function(data) { 
     if(response.msg != '') { 
     scope.messages.push(data); 
     } 
    }) 
    .finally(function() { 
     (function(method, scope) { 
     setTimeout(function(){ 
      method(scope); 
     }, 2000) 
    )(receivefb, scope); 
    }); 
} 
receivefb($scope); 

HTML部分:

+0

@Siguzaは質問のコメントセクションで簡単に指摘したように、私はウェブソケットを使うことができます。ポーリングは本当に良い解決策ではありません。 WebSocketは、ユーザーのブラウザとサーバーの間で対話型の通信セッションを開くことを可能にする高度な技術です。このAPIを使用すると、サーバーにメッセージを送信して、応答をサーバーにポーリングすることなくイベント駆動の応答を受信できます" – stevenvanc

+0

@stevenvancはあなたが私の答えを慎重に読まなかったようです(1)。私の答えでは、2つの解決策を挙げました:開発者がサーバーを完全に制御でき、nodejをインストールできる場合、顧客はwhm、cpanel、php、mysqlなどを持っている安い5 $/moのホスティングを持っています。 – num8er

+0

"サーバーへのリクエストをしなければ新しいメッセージがあるかどうかは検出できません" - トップとポイント2.以下の情報1.私は同意します – stevenvanc

関連する問題