AngularJS将回调从控制器传递给服务

时间:2014-03-14 21:34:23

标签: javascript angularjs

我的控制器定义如下:

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绑定,它仍然是假的。 我有什么误解?我想它应该可以工作,但我想知道在修改范围变量时,函数传递是否正常。

1 个答案:

答案 0 :(得分:2)

致电消化

handleNewTechMessage回调中,使用$scope.$apply()调用范围消化。如果没有这种消化调用,Angular就没有理由理解可能已经改变的东西。

作为数组回调

在您的实现中,每个处理程序注册都会调用io.connect。最好有一个内部数组,推送回调,并在套接字消息上循环。