Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理角度服务中的信号器事件?_Javascript_Jquery_Asp.net_Angularjs_Signalr - Fatal编程技术网

Javascript 如何处理角度服务中的信号器事件?

Javascript 如何处理角度服务中的信号器事件?,javascript,jquery,asp.net,angularjs,signalr,Javascript,Jquery,Asp.net,Angularjs,Signalr,我有一个Angular应用程序,它有一个结束信号器交互的服务。我可以从页面和Angular服务中向服务器发送数据,但只能处理页面中的事件(服务中的事件从不触发) 在某些情况下,这是一个测试应用程序,用于在与正在播放的视频不同的窗口中设置视频控件 信号机集线器代码 public class VideoHub : Hub { public void SetPlaybackStatus(string status) { Clients.All.statusChanged

我有一个Angular应用程序,它有一个结束信号器交互的服务。我可以从页面和Angular服务中向服务器发送数据,但只能处理页面中的事件(服务中的事件从不触发)

在某些情况下,这是一个测试应用程序,用于在与正在播放的视频不同的窗口中设置视频控件

信号机集线器代码

public class VideoHub : Hub
{
    public void SetPlaybackStatus(string status)
    {
        Clients.All.statusChanged(status);
    }
}
commsTest.service('signalRService', [
    '$', function ($) {

        var proxy,
            initialized = false,
            statusChangeCallbacks = [];

        var initialize = function (callback) {

            // Get the connection object
            var connection = $.hubConnection();

            // Create proxy
            proxy = connection.createHubProxy('videoHub');

            // Start connection
            connection.start().done(function () {
                initialized = true;
                console.log("Connected");
                callback();
            });

            // This bit here never fires
            proxy.on('statusChanged', function (status) {
                console.log("Caught from service.", status);
                callStatusChangedCallbacks(status);
            });
        };

        var setPlaybackStatus = function (status) {
            if (!initialized) {
                initialize(function() {
                    setPlaybackStatus(status);
                });
            } else {
                // This bit works as expected
                proxy.invoke('setPlaybackStatus', status);
            }
        };

        var onStatusChanged = function (callback) {
            if (callback) {
                statusChangeCallbacks.push(callback);
            }
        };

        function callStatusChangedCallbacks(status) {
            for (var i = statusChangeCallbacks.length - 1; i >= 0; i--) {
                statusChangeCallbacks[i](status);
            }
        }

        return {
            onStatusChanged: onStatusChanged,
            setPlaybackStatus: setPlaybackStatus
        };
    }
]);
角度控制器

commsTest.controller("videoController", [
    '$scope', 'signalRService',
    function ($scope, signalRService) {

        $scope.playbackStatus = "No Status";

        signalRService.onStatusChanged(function (status) {
            console.log("Callback status", status);
            $scope.playbackStatus = status;
        });
    }
]);
信号机角度服务

public class VideoHub : Hub
{
    public void SetPlaybackStatus(string status)
    {
        Clients.All.statusChanged(status);
    }
}
commsTest.service('signalRService', [
    '$', function ($) {

        var proxy,
            initialized = false,
            statusChangeCallbacks = [];

        var initialize = function (callback) {

            // Get the connection object
            var connection = $.hubConnection();

            // Create proxy
            proxy = connection.createHubProxy('videoHub');

            // Start connection
            connection.start().done(function () {
                initialized = true;
                console.log("Connected");
                callback();
            });

            // This bit here never fires
            proxy.on('statusChanged', function (status) {
                console.log("Caught from service.", status);
                callStatusChangedCallbacks(status);
            });
        };

        var setPlaybackStatus = function (status) {
            if (!initialized) {
                initialize(function() {
                    setPlaybackStatus(status);
                });
            } else {
                // This bit works as expected
                proxy.invoke('setPlaybackStatus', status);
            }
        };

        var onStatusChanged = function (callback) {
            if (callback) {
                statusChangeCallbacks.push(callback);
            }
        };

        function callStatusChangedCallbacks(status) {
            for (var i = statusChangeCallbacks.length - 1; i >= 0; i--) {
                statusChangeCallbacks[i](status);
            }
        }

        return {
            onStatusChanged: onStatusChanged,
            setPlaybackStatus: setPlaybackStatus
        };
    }
]);
事件处理程序(上面标记)从不在服务内激发。我在页面上直接显示了以下代码:

$(function() {
    // Gett the connection object
    var connection = $.hubConnection();

    // Create proxy
    var proxy = connection.createHubProxy('videoHub');

    // Start connection
    connection.start();

    // This gets called as expected
    proxy.on('statusChanged', function (status) {
        console.log("Caught in page.", status);
    });
})
这将在服务器代码发出更新时按预期触发

我还尝试在JS端使用直接方法而不是代理,但得到了相同的结果

i、 e

Angular中对象的封装是否会阻止JS接收事件

为了完成起见,我将jQuery作为如下内容传递:

var commsTest = angular.module('commsTest', ['ngRoute'])
    .config(['$locationProvider', '$routeProvider', '$httpProvider', function ($locationProvider, $routeProvider, $httpProvider) {
    delete $httpProvider.defaults.headers.common['X-Requested-With'];

    // Routes stuff
}]);

commsTest.value('$', $);

欢迎提出任何建议。

对我有用。这是我的名片。一些修改:1。将
代理移动到
连接开始之前的
上。使用
$log
而不是
控制台
我无法使用angular 1.2.12和SignalR 2.0再现您的问题(使用您的代码而不进行更改)@LostInComputer-谢谢!在
连接之前移动
代理。在
上。启动
修复它。老实说,我不知道为什么这会有什么不同,但我很高兴看到这项活动终于启动了!如果你愿意,你可以看看我的名为SignalR.EventAggregatorProxy的库,它的设计考虑了SPA。