AngularJS не может использовать область внутри обратного вызова веб-сокета - PullRequest
0 голосов
/ 01 декабря 2018

<b>$scope</b> не работает внутри функции обратного вызова.

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.Но, похоже, это не работает.Пожалуйста, помогите.

Update1:

Этот контроллер используется с директивой 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"];}).Но это не сработало.

1 Ответ

0 голосов
/ 01 декабря 2018

Было бы разумнее перенести конструктор websocket в службу и использовать только одно соединение.Как написано, ng-repeat создает несколько соединений через веб-сокет с сервером.Приложение на стороне сервера обрабатывает каждое соединение по-разному.Очевидно, сервер отвечает на последнее установленное соединение, а не на каждое в отдельности.Для получения дополнительной информации см. Stackoverflow: несколько веб-сокетов .

См. Также Github WS Issue # 684 - Несколько соединений, но один websocket.on("message") источник событий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...