2013-08-19 90 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总是提问的最佳地点。