2016-11-28 12 views
0

私のアプリでチャットのサービスを作成しようとしています。これは私のsignalR角度サービスのコードです。私がしたいのは、私のコードを繰り返さないことです、私は最初の非機能的なケースのような別の関数を作成し続けたいと思いますが、それをどうやって行うのか分かりませんでした。誰かがどこに問題があるのか​​、その2つのタイプのリターンの違いは何かを教えてくれますか?どちらの場合も、初期化されたものの、2番目のものだけがサーバー側からの呼び出しをキャッチします。そこにこの問題ここAngularJS with signalRサービスがサーバコールで機能しない

(function() { 
app.service("SignalRService", ["$rootScope", SignalRService]); 
"use strict"; 
function SignalRService($rootScope) { 
    //this is not working version 
    return { 
     channelHub: null, 
     initialize: function() { 
      //var chatHub = $.connection.channelHub; 
      var connection = $.hubConnection(); 
      this.channelHub = connection.createHubProxy('channelHub'); 
      // Start Hub 
      connection.start().done(function() { }); 
     }, 
     getMsg: function (eventName, callback) { 
      this.channelHub.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(this.channelHub, args); 
       }) 
      }) 
      console.log(eventName); 
     } 
    } 
    //but if i retype it like this its working w/o any problem 
    return {  
     getMsg: function (eventName, callback) { 
      var connection = $.hubConnection(); 
      var channelHub = connection.createHubProxy('channelHub'); 

      channelHub.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(channelHub, args); 
       }); 
      }); 
      connection.start().done(function() { }); 
     } 
    }; 
}})(); 

私は機能とdebugerとコンソールログに応じて初期化SERVIS呼び出す私の角度コントローラは、機能「newChannelMessageが初期化されているに関連するものは何もありませんし、エラーが

がスローされませんので、私はハブを含んでいませんでし私は「newChannelMessage」関数を呼び出すが、それは、クライアント側でこの機能に到達することはありませんし、何もRLY私の実装方法の第一の場合には起こらないのはここ
(function() { 
app.controller("ChannelController", ["$scope", "$http", "SignalRService" ]); 
function ChannelController($scope, $http, SignalRService) { 
    "use strict"; 
    //**--------------------signalR--------------------------------**// 
    SignalRService.initialize(); 
    SignalRService.getMsg("newChannelMessage", function (message, username) { 
     $scope.channel.push(message, username); 
    }); 
}})(); 

は私のサーバーのコントローラである

public class CommentController : BaseApiController 
{ 
    private ApplicationDbContext _context; 
    private CommentRepository _repository; 
    private IHubContext _ctx; 

    public CommentController() 
    { 
     //initialize of db context 
     _context = new ApplicationDbContext(); 
     _repository = new CommentRepository(); 
     _ctx = GlobalHost.ConnectionManager.GetHubContext<ChannelHub>(); 
    } 

    [Route("create")] 
    [HttpPost] 
    public async Task SendMsg([FromBody] JObject data) 
    { 
     var channelId = data["idData"].ToObject<int>(); 
     Comment comment = data["channelMsgData"].ToObject<Comment>(); 
     comment.UserId = await GetIdUsingUsername(comment.UserName);   
     await _repository.StoreChannelMessage(comment, channelId); 
     _ctx.Clients.All.newChannelMessage(comment.Message, comment.UserName); 
    } 

    public async Task<string> GetIdUsingUsername(string username) 
    { 
     var user = await _context.Users.FirstOrDefaultAsync(x => x.UserName == username); 
     var id = user.Id; 
     return id; 
    } 
} 

答えて

0

お試しください。

function SignalRService($rootScope) { 

      var connection = null; 
      var channelHub = null; 

      var initialize = function() { 
       connection = $.hubConnection(); 
       channelHub = connection.createHubProxy('channelHub'); 
       connection.start().done(function() { 
        console.log("Hub started"); 
       }); 
      } 

      var getMsg = function (eventName, callback) { 
       var deferred = $q.defer(); 
       channelHub.on(eventName, function() { 
        var args = arguments; 
        $rootScope.$apply(function() { 
         callback.apply(channelHub , args); 
        }); 
       }); 
      } 


      return { 
       initialize: initialize, 
       getAllUsers: getAllUsers 
      } 
} 
関連する問題