2014-09-12 94 views
0

每一个。我弄清楚我最近遇到的问题是什么,但现在我需要一个建议如何解决这个问题。我试图启动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")*@ 
} 

回答

0

你调用load方法服务器完全启动之前的页面。 SignalR集线器异步启动,这意味着您必须在调用方法之前确保它已启动。

我看了一下你使用的signalr hub类。它将启动方法的承诺放在返回的对象上。您可以通过hub.promise访问它。注册当连接成功启动到E通知回调:

hub.promise.done(function(){ 
    // connection established 
    // call your hub method here 
}); 

你不能从你的控制器同步调用枢纽的方法,而不是你需要提供一个承诺给控制器。控制器然后可以注册回复该承诺并调用中心方法。当然,还有很多其他可能的解决方案(比如使用angularjs事件),但最终归结为:在控制器的初始化时间,不能直接调用集线器上的方法。