首页 > 解决方案 > 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"];}). 但这没有用。

标签: javascriptangularjssocketswebsocket

解决方案


将 websocket 构造函数移动到服务并仅使用一个连接会更明智。正如所写,ng-repeat正在创建到服务器的多个 websocket 连接。由服务器端应用程序以不同方式处理每个连接。显然,服务器正在响应最后一个连接,而不是单独响应每个连接。有关更多信息,请参阅Stackoverflow:多个 Websocket

另请参阅Github WS 问题 #684 - 多个连接,但单个websocket.on("message")事件发射器


推荐阅读