3

有什么方法可以刷新 Angular 中的控制器?考虑以下示例:

<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 中?

另外,作为第二个问题:有没有一个好地方可以去了解更多关于 Angular 的信息?该网站上的文档似乎有点不清楚。

4

2 回答 2

2

连接失败时需要重新连接 Web 套接字或需要重新启动以进行某些重新调整。我认为您不应该通过“重新启动控制器”来重新启动网络套接字。

我的建议是创建一个“网络套接字”服务来维护自己的逻辑(例如,连接失败时重新连接套接字),控制器只处理模型和视图绑定。

<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>

在上面的例子中,当 socket 客户端收到“restart”消息或连接失败时,web socket 将重新连接。希望这对你有帮助。

于 2013-08-19T08:09:53.227 回答
1
  1. 一种解决方案是尝试使用$route.reload(). 更好的解决方案是尝试在onerror.

  2. 我发现学习 angularJS 的最佳地点是Egghead。如果事情不清楚,stackoverflow 总是最好的地方。

于 2013-08-19T07:18:26.027 回答