【问题标题】:AngularJS and SignalR - difference in defining the app moduleAngularJS 和 SignalR - 定义应用程序模块的区别
【发布时间】:2014-07-14 21:23:31
【问题描述】:

我正在尝试将我的 SignalR 代码与 angular 集成。我可能遵循了 5 个不同的教程,但无法使其正常工作。

Following this tutorial,我的代码中唯一的区别是 my app.js 文件如下所示:

var myApp = angular.module('myApp', []);

$(function () {
      $.connection.hub.url = server;
      $.connection.hub.logging = true;

      $.connection.hub.start().done(function () {
          console.log('Hub connection open. ID: ' + $.connection.hub.id);
      });
});

angular.module('myApp').value('chat', $.connection.testhub);

教程 app.js 如下所示:

(function() {
  angular.module('myApp', [])

  $(function () {
      $.connection.hub.url = server;
      $.connection.hub.logging = true;

      $.connection.hub.start().done(function () {
          console.log('Hub connection open. ID: ' + $.connection.hub.id);
      });
   });

  angular.module('myApp').value('chat', $.connection.testhub);
});

当从控制器访问“聊天”服务时,我可以 console.log 我的集线器。 但 SignalR 日志显示连接开始是在订阅任何集线器之前发生的,因此当然不会调用任何客户端方法。

所以我的问题是,我们的 app.js 文件中的差异是导致此问题的原因吗?为什么?

其他一切都是一样的,我已经验证 SignalR 服务器可以正常工作。

【问题讨论】:

    标签: javascript angularjs signalr


    【解决方案1】:

    【讨论】:

    • 谢谢。我之前尝试过类似的不同解决方案但没有成功,当我找到一个更简单的解决方案(教程)时我很高兴。为什么教程在没有这个队列的情况下工作?我会加入你的链接,然后再试一次。
    【解决方案2】:

    在多次尝试均未成功后,我决定使用我的 ApplicationController(所有控制器的父级)作为 SignalR 处理程序。从那里我可以订阅所有必要的集线器并将事件广播到子范围以处理不同的需求。我确信这不是最佳实践,但对于我的小型应用程序来说可能就足够了。

    myApp.controller('ApplicationController', ['$scope', 'logger', 'AuthService', function ($scope, logger, AuthService) {
    
    $.connection.hub.url = serverUrl;
    $.connection.hub.logging = true;
    
    $.connection.testhub.client.getStaff = function (value) {
        $scope.$broadcast('someEvent', value);
    };
    
    $.connection.hub.start().done(function () {
        console.log('Hub connection open. ID: ' + $.connection.hub.id);
    });
    
    $.connection.hub.error(function (err) {
        console.log("Error: " + err);
    });
    }]);
    

    所以我将广播以将事件发送到下游并发出以将它们从子控制器发送到父控制器。我想这样就可以了。

    【讨论】:

    • 您可以使用 AngularJS 模块(在您的情况下为 myApp)上的 run(...) 方法来在应用程序启动时启动连接,而不是在控制器中初始化 SignalR 客户端(只需替换 $ $rootScope 的作用域)。然后您的控制器可以订阅广播的事件。
    • 谢谢,但有什么区别?我的 ApplicationController 是所有其他控制器的父级。
    • 与您的方法相比有两个优点: 1. 您不会因依赖外部库而“污染”您的控制器。这不仅是代码库的更好结构,而且在编写单元测试时也是必不可少的。在您的控制器中,您可以依赖 AngularJS 事件机制,而无需了解使用的库。 2.在您当前的场景中似乎不是这种情况,但是当使用 ng-view 和路由时,控制器将在导航操作中被破坏,更重要的是,它们将在导航返回时始终新创建(启动新连接)
    • 我明白了,谢谢。我会考虑你的提议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多