Javascript 信号机和AngularJS指令

Javascript 信号机和AngularJS指令,javascript,angularjs,signalr.client,Javascript,Angularjs,Signalr.client,每个人。我想知道我最近的问题的原因是什么,但现在我需要一个如何解决这个问题的建议。错误发生在我尝试使用using for ng init指令启动SignalR javascript客户端时。 以下是错误: Error: SignalR: Connection must be started before data can be sent. Call .start() before .send() at Object.signalR.fn.signalR.send (localhost:4745.

每个人。我想知道我最近的问题的原因是什么,但现在我需要一个如何解决这个问题的建议。错误发生在我尝试使用using for ng init指令启动SignalR javascript客户端时。 以下是错误:

Error: SignalR: Connection must be started before data can be sent. Call .start() before .send()
at Object.signalR.fn.signalR.send (localhost:4745.lan/Scripts/jquery.signalR-2.1.1.
当我为ng使用信号器脚本时,单击Everything即可。这里只是一个测试应用程序:

angular.module('app', ['SignalR'])
.factory('SomeService', ['$rootScope', 'Hub', function ($rootScope, Hub) {

//declaring the hub connection
var hub = new Hub('myHub', {

    //client side methods
    listeners: {
        'doAction': function (message) {
            alert(message);
            console.log("It works");
            $rootScope.$apply();
        }
    },
    //server side methods
    methods: ['someAction'],


    //handle connection error
    errorHandler: function (error) {
        console.error(error);
    }

});
var load = function () {
    console.log(hub);

    hub.someAction(); //Calling a server method
};

return {
     loadSomeMethod: load
};
}])
   .controller('appController', ['$scope', 'SomeService', function ($scope, SomeService) {
    $scope.callMethod = SomeService.loadSomeMethod;
    $scope.text = "Index from Angular";
  }]);
查看页面

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div ng-app="app" ng-controller="appController">
<h2>{{text}}</h2>
<input type="button" name="GreetAll" value="Greet All" ng-click="callMethod()" />
</div>
@section scripts
{
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jquery.signalR")
@*<script src="~/SignalR/Hubs"></script>*@
@Scripts.Render("~/bundles/angular")
@Scripts.Render("~/bundles/angular-resource")
@Scripts.Render("~/bundles/angular-signalr-hub")
@Scripts.Render("~/bundles/App")
@*@Scripts.Render("~/bundles/AppNew")*@
}

您正在服务器完全启动之前调用load方法。signarhub是异步启动的,这意味着您必须确保它在调用方法之前已经启动

我看了你正在使用的信号集线器类。它将start方法的承诺放在返回的对象上。您可以通过hub.promise访问它。将回调注册到e,并在连接成功启动时通知:

hub.promise.done(function(){
    // connection established
    // call your hub method here
});
您不能从控制器同步调用集线器方法,而是需要向控制器提供承诺。然后,控制器可以注册对该承诺的回调,并调用hub方法。当然,还有很多其他可能的解决方案,比如使用angularjs事件,但最终归结起来就是:在控制器中初始化时,您不能直接调用集线器上的方法