gpt4 book ai didi

javascript - AngularJS 中的刷新 Controller

转载 作者:行者123 更新时间:2023-11-29 10:46:38 25 4
gpt4 key购买 nike

有什么方法可以在 Angular 中刷新 Controller 吗?考虑以下示例:

<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。有没有办法强制 Controller 再次运行,创建一个新的监听函数来将新连接的消息推送到 $scope?

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

最佳答案

Web 套接字在连接失败时需要重新连接,或者需要重新启动以进行一些更新。我认为你不应该重新启动网络套接字通过“重新启动 Controller ”。

我的建议是创建一个“网络套接字”服务,它将维护自己的逻辑(例如,在连接失败时重新连接套接字), Controller 只处理模型和 View 绑定(bind)。

<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 socket会在socket client收到“restart”消息或者连接失败时重新连接。希望对您有所帮助。

关于javascript - AngularJS 中的刷新 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18307207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com