當連接失敗或需要重新啓動一些關係時,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套接字。希望這對你有所幫助。
瞭解有關Angular的更多信息:http://egghead.io – AdityaSaxena
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