2013-08-19 114 views
3

有什麼辦法來刷新角控制器?請看下面的例子:刷新控制器AngularJS

<div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div> 
<script> 
var ws = new WebSocket(something, something); 
function MsgCtrl($scope) { 
    $scope.messages = []; 
    ws.onmessage = function(e) { 
     $scope.$apply(function() { 
      $scope.messages.push(e.data); 
     }); 
    } 
} 
</script> 

如果WebSocket連接失敗,或者已經重新啓動由於某種原因,一個新的WebSocket必須創建並聽取。有什麼辦法強制控制器再次運行,創建一個新的監聽函數來將新連接的消息推入$ scope?

此外,作爲二次問題:是否有一個很好的地方去了解更多關於角?該網站上的文件似乎有點不清楚。

+1

瞭解有關Angular的更多信息:http://egghead.io – AdityaSaxena

+0

Second egghead.io also http://www.bennadel.com/blog/2446-Using-Controllers-In-Directives-In-AngularJS.htm and http ://www.yearofmoo.com/還有http://www.youtube.com/watch?v=ZhfUv0spHCY YouTube上有很多其他內容。有一本O'Reilly的書,但它立即過時了。另外檢查yeoman和角種子,即使你不使用它們,它們很好的例子。 – shaunhusain

回答

2

當連接失敗或需要重新啓動一些關係時,Web套接字需要重新連接。我認爲你不應該通過「重新啓動控制器」重新啓動web sockect 。

我的建議是,建立一個「網絡套接字」服務,將保持其自身的邏輯(例如,重新連接插座時連接失敗)和控制器只處理模型和視圖結合。

<html ng-app="MyApp"> 
.... 
<div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div> 
</html> 
<script> 

    var myApp = angular.module("MyApp",[]); 
    myApp.factory("WebSocket",function(){ 
     var ws; 
     var triedTime=0; 
     var maxRetryTime=20; 
     return { 
      createWS: function(server,protocol,handler){ 
       ws = new WebSocket(server, protocol); 
       ws.onmessage = handler; 
       ws.onerror = function(e){ 
        this.restartWS(server,protocol,handler); 
       } 
      }, 
      closeWS: function(){ 
       if(ws) ws.close(); 
      }, 
      restartWS: function(server,protocol,handler){ 
       if(triedTime<=maxRetryTime){ 
        this.closeWS(); 
        this.createWS(server,protocol); 
        triedTime++; 
       } 
      } 
     }; 
    }); 

    function MsgCtrl($scope, WebSocket){ 
     $scope.messages = []; 

     WebSocket.createWS("something","something",$scope.msgHandler); 

     $scope.msgHandler = function(e){ 
      $scope.$apply(function() { 
       //model update 
       $scope.messages.push(e.data); 

       var msg = JSON.parse(e.data); 

       switch(msg.cmd) 
       { 
        case "restart": 
        WebSocket.restartWS("something","something",$scope.msgHandler); 
        break; 
       } 
      }); 
     } 

    } 
</script> 

在上例中,當套接字客戶端收到「重啓」消息或連接失敗時,將重新連接web套接字。希望這對你有所幫助。

1
  1. 其中一種解決方法是嘗試使用$route.reload()重新加載頁面。更好的解決方法是嘗試重新啓動onerror上的websocket。

  2. 我覺得學習angularJS最好的地方是Egghead。如果事情不清楚,stackoverflow總是提問的最佳地點。