我的控制器定义如下:
menuController.controller('menuController', ['$scope', '$rootScope', '$log', 'techMessageService', 'subscriptionService',
function ($scope, $rootScope, $log, techMessageService, subscriptionService) {
$scope.newTechMessage = false;
var handleNewTechMessage = function (data) {
$log.log('handleTechMessage: ' + data);
$scope.newTechMessage = true;
};
var init = function () {
$log.log('menuController init');
subscriptionService.subscribeTechMessages(handleNewTechMessage);
};
init();
}]);
subscriptionService就像:
subscriptionService.service('subscriptionService', ['$log', 'backendService', function ($log, backendService) {
this.subscribeTechMessages = function (handler) {
$log.log('subscriptionService:subscribeTechMessages');
var socket = io.connect('https://localhost:9001');
socket.on('connect', function () {
socket.emit('adduser', '80040002');
});
backendService.post('/subscribeTechMessages');
socket.on('NEW_MESSAGE', handler);
};
this.unsubscribeTechMessages = function () {
$log.log('subscriptionService:unsubscribeTechMessages');
return backendService.post('/unsubscribeTechMessages');
};
}]);
我遇到的问题是传递给服务的handleNewTechMessage函数。它作为事件处理程序执行,它将newTechMessage范围变量设置为true,但更改不会反映在视图上。我在视图上有newTechMessage绑定,它仍然是假的。 我有什么误解?我想它应该可以工作,但我想知道在修改范围变量时,函数传递是否正常。
答案 0 :(得分:2)
致电消化
在handleNewTechMessage
回调中,使用$scope.$apply()
调用范围消化。如果没有这种消化调用,Angular就没有理由理解可能已经改变的东西。
作为数组回调
在您的实现中,每个处理程序注册都会调用io.connect
。最好有一个内部数组,推送回调,并在套接字消息上循环。