Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS无法在websocket回调中使用作用域_Javascript_Angularjs_Sockets_Websocket - Fatal编程技术网

Javascript AngularJS无法在websocket回调中使用作用域

Javascript AngularJS无法在websocket回调中使用作用域,javascript,angularjs,sockets,websocket,Javascript,Angularjs,Sockets,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:801

$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\u bid\u data=data[“message”]更新最后一个元素而不是第一个元素的范围。我还尝试过使用
$scope.$apply(function(){$scope.bid.top_bid_data=data[“message”];})
。但是这不起作用。

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


更新角度范围之外的范围时,请参见

使用
$apply
context@charlietfl请参阅更新1。我已经说明了主要问题。范围正在更新。但不是当前元素的范围。最后一个元素的作用域已更新。因为angular不知道在angular上下文之外(例如在onmessage回调中)更新作用域时运行摘要,所以您必须告诉它使用$apply@charlietfl否。范围正在更新。但不是当前元素的,而是最后一个元素的。解决办法是什么?请创建一个重现问题的演示,但有多个服务器端使用者的路径类似于
ws://myip:8010/notif/
ws://myip:8010/message/
等。如果我定义了一个服务并使用了一个连接,我将无法将其更改为其他路径。有什么建议吗?一般来说,指令不应该与外部世界建立连接,它们应该是将用户事件传递给视图控制器,视图控制器使用服务将业务事件传递给外部世界。我刚刚注意到您的。它实际上是在每次调用构造函数时用一个新连接替换websocket。