【发布时间】:2019-05-03 11:24:18
【问题描述】:
<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 变量。但它似乎不起作用。请帮忙。
更新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"];})。但这没有用。
【问题讨论】:
-
在角度上下文之外更新范围时使用
$apply -
@charlietfl 请参阅更新 1。我已经说明了主要问题。范围正在更新。但不是当前元素的范围。最后一个元素的范围已更新。
-
因为 Angular 在更新 Angular 上下文之外的范围时(例如在 onmessage 回调中)不知道运行摘要,所以你必须告诉它使用 $apply
-
@charlietfl 否。范围正在更新。但不是当前元素,而是最后一个元素。解决办法是什么?请。
-
创建一个重现问题的演示
标签: javascript angularjs sockets websocket