我目前正在玩一个使用websocket与后端通信的有角度的应用程序。我在使angular的数据绑定正常工作时遇到了一些麻烦。
在下面的示例中,我创建了一个服务,该服务创建了websocket连接。如果websocket收到一条消息,我只需将该消息推送到包含所有收到消息的数组中即可。
在我的控制器中,我将该消息数组绑定到作用域,然后用于ng-repeat
在我的局部视图中列出所有消息。
服务:
factory('MyService', [function() {
var wsUrl = angular.element(document.querySelector('#ws-url')).val();
var ws = new WebSocket(wsUrl);
ws.onopen = function() {
console.log("connection established ...");
}
ws.onmessage = function(event) {
Service.messages.push(event.data);
}
var Service = {};
Service.messages = [];
return Service;
}]);
控制器:
controller('MyCtrl1', ['$scope', 'MyService', function($scope, MyService) {
$scope.messages = MyService.messages;
}])
部分:
<ul>
<li ng-repeat="msg in messages">
{{msg}}
</li>
</ul>
但是,这不能正常工作。收到新消息并将其推送到数组时,应显示所有消息的列表不会得到更新。我期望它会由于角度双向数据绑定而被更新。
我找到了一种解决方案,该解决方案可以通过将消息推送包装到服务中的调用中来$rootScope.apply()
工作:
ws.onmessage = function(event) {
$rootScope.$apply(function() {
Service.messages.push(event.data);
});
}
我的问题是:
这是我不使用列表时不会自动更新的angular的预期行为$rootScope.apply()
吗?
为什么什至需要将其包装$rootScope.apply()
?
是否使用$rootScope.apply()
正确的方法来解决此问题?
有更好的替代方法来$rootScope.apply()
解决此问题吗?
是的,AngularJS的绑定是“基于回合的”,它们仅在某些DOM事件以及对$apply
/的调用时触发$digest
。有一些有用的服务,例如$http
和$timeout
,它们可以为您做包装,但除此之外的任何东西都需要调用$apply
或$digest
。
您需要让AngularJS知道您已经更改了绑定到范围的变量,以便它可以更新视图。不过,还有其他方法可以做到这一点。
这取决于您的需求。将代码包装到时$apply()
,AngularJS将代码包装到内部angularjs日志记录和异常处理中,当结束时,它将传播$digest
到控制器的所有作用域。在大多数情况下,包裹$apply()
是最好的方法,它为将来可能要使用的角度功能留出了更多的空间。这是正确的方法吗?参见下文。
如果您不使用Angular的错误处理,并且知道更改不应传播到任何其他范围(root,控制器或指令),并且需要优化性能,则可以$digest
专门调用控制器的$scope
。这样脏检查不会传播。否则,如果您不希望Angular捕获错误,而是需要进行脏检查以传播到其他控制器/指令/ rootScope,则可以使用$进行包装,而不必使用$进行包装,而apply
只需$rootScope.$apply()
进行更改即可。
进一步参考:
$apply
vs$digest
Angular Websocket Status: Looking for feedback about new API changes An AngularJS 1.x WebSocket service for connecting client applications to servers. How do I add this to my project? You can download
问题内容: 有没有带WebSockets的Angular Universal示例? 服务器端渲染不知道在我的情况下是不是一个WebSocket对象。如果我使用socket.io,则尝试建立连接时节点服务器将挂起。 有关该问题的一些其他信息: 我从github下载了angular-universal- starter:https://github.com/angular/universal- sta
嗨,伙计们正在使用Websocket和Tomcat8得到以下错误am。
我无法编写一个能够通过WebSocket监听STOMP消息的服务器。我的问题在于stomp协议和JMS消费者的创建。 以下代码在createConnection上失败 有以下例外: 你能指出这个代码的问题吗?如何使用 AMQ 以编程方式配置 JMS 侦听器,使其能够通过 WebSocket/踩踏来配置队列或主题? 谢谢 新更新的代码因ActiveMQ传输而失败:tcp:///127.0.0.1:5
WebSockets是Web应用程序的下一代双向通信技术,可在单个套接字上运行,并通过HTML 5兼容浏览器中的JavaScript接口公开。 一旦与Web服务器建立Web Socket连接,就可以通过调用send()方法将数据从浏览器发送到服务器,并通过onmessage事件处理程序从服务器接收数据到浏览器。 以下是创建新WebSocket对象的API。 var Socket = new Web
问题内容: 我有一个PyQt Gui应用程序。此应用程序有一个主窗口,应在启动后打开。 此应用程序应监听websocket。 我试着解决它是这样的: 但是,启动应用程序后,主窗口没有打开。 如果没有“ ws.run_forever()”行,则打开主窗口,但应用程序不侦听websocket。 我需要在“背景”中收听网络套接字吗?你能帮助我吗? PS :(对不起,我的英语) 问题答案: 感谢engin