SignalR和AngularJS指令
问题描述:
每一个。我弄清楚我最近遇到的问题是什么,但现在我需要一个建议如何解决这个问题。我试图启动SignalR javascript客户端(使用https://github.com/JustMaier/angular-signalr-hub)执行ng-init指令时发生错误。 以下是错误:SignalR和AngularJS指令
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.
当我使用SignalR脚本NG-点击everithing是确定的。这里只是一个测试应用程序:
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方法服务器完全启动之前的页面。 SignalR集线器异步启动,这意味着您必须在调用方法之前确保它已启动。
我看了一下你使用的signalr hub类。它将启动方法的承诺放在返回的对象上。您可以通过hub.promise访问它。注册当连接成功启动到E通知回调:
hub.promise.done(function(){
// connection established
// call your hub method here
});
你不能从你的控制器同步调用枢纽的方法,而不是你需要提供一个承诺给控制器。控制器然后可以注册回复该承诺并调用中心方法。当然,还有很多其他可能的解决方案(比如使用angularjs事件),但最终归结为:在控制器的初始化时间,不能直接调用集线器上的方法。