javascript - AngularJS 无法在 websocket 回调中使用范围
问题描述
$scope
不在回调函数中工作。
angular.
module('common').
controller('bidVBoxController', ['$scope', '$location','$element', 'Socket', 'Bid',
function($scope, $location, $element, Socket,Bid){
var self = this;
self.socket = new Socket("ws://192.168.225.59:8010/ws/bidData/");
$scope.placeBid = function(){
self.socket.send({
type: "place_bid",
data: {
bidId: $scope.bid.id
}
});
};
console.log($scope.bid);
$scope.bid.top_bid_data="sss";//This works.
self.socket.onmessage(function(event) {
var data = JSON.parse(event.data);
console.log($scope.bid);//This doesn't work
$scope.bid.top_bid_data=data["message"];//This doesn't work
});
}])
回调函数被传递给self.socket.onmessage
应该更新$scope
变量的 。但它似乎不起作用。请帮忙。
更新1:
此控制器与指令一起使用,bidVBox
并且有多个元素:
<bid-v-box ng-repeat="bid in bids">
</bid-v-box>
当回调函数在第一个bid-v-box
元素的控制器中执行时,$scope.bid.top_bid_data=data["message"];
更新最后一个元素的范围,而不是第一个。我也尝试过使用$scope.$apply(function(){$scope.bid.top_bid_data=data["message"];})
. 但这没有用。
解决方案
将 websocket 构造函数移动到服务并仅使用一个连接会更明智。正如所写,ng-repeat
正在创建到服务器的多个 websocket 连接。由服务器端应用程序以不同方式处理每个连接。显然,服务器正在响应最后一个连接,而不是单独响应每个连接。有关更多信息,请参阅Stackoverflow:多个 Websocket。
另请参阅Github WS 问题 #684 - 多个连接,但单个websocket.on("message")
事件发射器
推荐阅读
- javascript - 如何将数据从表单发送到电子邮件
- google-apps-script - 在非活动工作表上重新加载
- excel - IF 语句问题不适用于选择
- python-3.x - 为什么 systemd 不在会话总线上发送单元属性更改通知?
- google-apps-script - Google 脚本 -- 添加用户时未找到域
- linux - Docker:本地 MySQL 卷的权限被拒绝
- jwt - 如何衡量 JWT 的大小?
- matlab - 算法构造块矩阵(matlab)
- r - “f(...) 中的错误:在对表对象使用 ggpmisc 的注释函数时,参数“table.theme”丢失,没有默认值”
- java - 字符串方法中空场景的最佳说明