【问题标题】:Angularjs controller doesn't work when socket.io event is in there当 socket.io 事件在那里时,Angularjs 控制器不起作用
【发布时间】:2026-02-16 03:10:02
【问题描述】:

我在连接上初始化了一个 socket.io 事件,该事件应该更改此控制器内项目的值(它控制图表)。但是当有 mySocket.on 时它根本不起作用,不要在这个控制器中渲染任何东西。当我把它拿出来时,它工作得很好。 mySocket 是一个正常的功能,我在其他控制器中使用它没有任何问题。

.controller('KnobCtrl', ['$scope', function($scope, mySocket) {
        $scope.itemsCounter = 0;
        $scope.roundValue = 0;

        mySocket.on('newConnectionCounter', function (itemsInRoundCounter, valueOfRound) {
            $scope.itemsCounter = itemsInRoundCounter;
            $scope.roundValue = valueOfRound;
        });

        $scope.data = {
            value: $scope.itemsCounter,
            options: {
            width: 190,
            fgColor: "#FFAB40",
            skin: "tron",
            thickness: .3,
            displayPrevious: false,
            readOnly: true,
            max: 30,
                inputColor: "#ffffff"
        }
        };
        $scope.options = {
            width: 150,
            fgColor: "#ffec03",
            skin: "tron",
            thickness: .8,
            displayPrevious: false,
            readOnly: true,
            max: 50
        };

        $scope.formatOptions = function(data) {
            data.formattedOptions = JSON.stringify(data.options).replace(/,/g,"\n");
            return data;
        };
    }]);

【问题讨论】:

    标签: javascript angularjs sockets


    【解决方案1】:

    看起来您希望它被注入到您的控制器函数中,但是您缺少传递给 .controller 方法的数组中的字符串:

    .controller('KnobCtrl', ['$scope', function($scope, mySocket) {
        ...
     });
    

    该函数的任何参数都应在数组中表示:

     .controller('KnobCtrl', ['$scope', 'mySocket', function($scope, mySocket) {
        ...
     });
    

    这假定“mySocket”是存在于“Angular 世界”中的东西(使用 angular.service、angular.factory 等创建)。如果“mySocket”只是一些全局定义的函数,那么您不希望它作为参数列出。如果该参数中没有传递任何内容,即使它全局存在,它也将是未定义的。注意:如果它只是 Angular 之外的一个全局定义的对象,您可能需要调用 $scope.$apply() 来启动处理程序中的摘要循环。

    看看它在你的应用中的工作位置,看看你是如何将它注入到你的控制器中的。

    【讨论】:

    • 你确实是对的。我错过了“mySocket”。它现在完美无缺,谢谢!
    • 但我面临另一个问题:在 $scope.data 中,value 参数不从 $scope.itemsCounter 获取数据。它始终为 0(但在 $scope.data 之外它显示正确的值)。知道我在这里缺少什么吗?
    • 代码当前的方式,$scope.data 在构造控制器时被设置为 $scope.itemsCounter 的值。因为套接字响应将是异步的,所以您需要在套接字处理程序中处理将新值推送到 $scope.data 中:$scope.data.value = itemsInRoundCounter;
    • 非常感谢,非常感谢!它确实解决了这个问题。