正如我们在问题的 cmets 中所讨论的,当您的 Angular ngRoute 控制器部分路由从给定状态改变时,您希望断开与套接字的连接;这是不同的,因为部分路由单页应用程序不会触发全新的页面,而是加载部分内容(在部分/模板文件或脚本定义中定义)。这就是为什么 Furkan Başaran's answer 不能立即为您在同一个 SPA 中的 Angular 路由状态之间的更改工作的关键。
我准备了一个 plunker,它是一个相当基本的 AngularJS 应用程序;它有三个 html 部分,它使用 ngRouter 在三个相应的路由上显示,并在路由更改发生时调用 的函数。在这种情况下,它会引发警报功能,而在您的情况下,您可能会检查该路由是否指向任何您想要提供套接字功能的路由。
注意:每次 Angular 应用注册路由变化时都会发生变化,所以初始建立时会注册一个空白值为/ 状态,然后每次从负载变化时,包括@987654325 @。
Plunker(嵌入式)链接:
http://embed.plnkr.co/ayjgYCsox7RGl5OjyGsV/
快速分解:
- 我首先定义了在 ngRouter 更改时触发的处理函数。传递的值是注册的路由(在
/ 或/index.html 之后),例如/potatoes,在我的示例中就是这种情况。这是您应该执行socket.disconnect(); 的地方。
function changedMyPartialRoute(val){
alert('url has changed to: ' + val);
}
- 在我定义了我的应用 (
angular.module('appName', [...) 之后,我为我的 ngRouter 设置定义了配置。
.config(['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
$routeProvider
.when('/meat', {
templateUrl: 'meat.html',
controller: 'MeatCtrl',
controllerAs: 'meat'
})
.when('/potatoes', {
templateUrl: 'potatoes.html',
controller: 'PotatoCtrl',
controllerAs: 'potato'
})
.when('/bacon', {
templateUrl: 'bacon.html',
controller: 'BaconCtrl',
controllerAs: 'bacon'
})
.otherwise({
redirectTo: '/meat'
});
}])
- 最后,我在应用程序(模块)上调用一个运行块,以提供该挂钩来检测更改。我传入 $rootScope 和 $location,它在 $rootScope 上执行 $watch 以检测 $location.path() 中的更改。整个运行块:
.run( function($rootScope, $location) {
$rootScope.$watch(function() {
return $location.path();
},
function(val){
// the handling function from step 1
changedMyPartialRoute(val);
});
})
如果您需要使用 $rootScope 做某事,我怀疑您可能会这样做,您需要通过 changedMyPartialRoute 函数传递 $rootScope 句柄或只需在.run 块中的函数回调。 This HTML5rocks.com tutorial 通过挂钩 $rootScope 在他们的 Angular 应用程序中显示他们的配置,而不是您在上面的 cmets 中提到的 $scope。
希望对你有帮助!