如何'重启'angularjs应用程序

时间:2014-04-03 16:16:59

标签: javascript angularjs

在我的AngularJS应用程序中,我有一个基于WebSocket的服务。如果WebSocket连接中断,我想完全重启'应用程序(从$ route转到默认页面,重新创建服务等)。这可以实现吗?这就是我的开始,但从那时起我不知道如何继续:

模块:

(function () {
    angular.module('mainModule', ['ngRoute'])
        .config(['$routeProvider', function ($routeProvider) {
            $routeProvider.
            when('/home', {

                templateUrl: 'partials/home.html',
                controller: 'appController'
            }).
            when('/register', {

                templateUrl: 'partials/register.html',
                controller: 'appController'
            }).
            otherwise({
                redirectTo: '/home'
            });
        }]);
}());

服务:

(function () {

    var app = angular.module('mainModule');

    app.service('$wsService', ['$q', '$window', function ($q, $window) {

        $window.console.log("WebSocket SERVICE: started");

        var self = this;
        var ws = new WebSocket("ws://127.0.0.1:9090");
        this.isConnected = function (m) {};

        ws.onopen = function () {
            $window.console.log("WebSocket SERVICE: connected");
            self.isConnected(true);
        };

        ws.onmessage = function (m) {
            //do whatever I want to do
        };

        ws.onerror = function () {
            $window.console.log("WebSocket SERVICE: disconnected");
            self.isConnected(false);
        };

    }]);
}());

控制器:

(function () {

    var app = angular.module('mainModule');

    app.controller('appController', ['$route', '$scope', '$wsService', function ($route, $scope, $wsService) {

        $wsService.isConnected = function (m) {
            //restart logic
        };
    }]);
}());

因为我的重启逻辑'我试过" $ route.reload();"但是你已经知道它并不能满足我的需要。最终我会弹出一个警告消息(bootstrap modal)通知用户连接已经丢失,并且在该模式中点击一个按钮,它将重新加载应用程序并转到/ home。我不是在问这个弹出窗口是怎么做的,因为这已经完成了。然而,至于现在,我需要弄清楚应用程序的总重新加载的逻辑。有任何想法吗?感谢。

3 个答案:

答案 0 :(得分:32)

回答我自己的问题,通过反复试验来实现:

$scope.$apply(function() {
    $location.path('/home');
    $window.location.reload();
});

这将转到/ home(默认)并重新加载所有内容,从而创建新的服务,模块,控制器等。如果有更好的方法(如果我在模块中将默认路径更改为/ blah,则会赢得& #39; t拿起它,因此我也必须编辑这个代码),让我知道:))

答案 1 :(得分:8)

我做了同样的事情:

$window.location.href = '/home';

答案 2 :(得分:2)

我对你的答案进行了一些调整,这对UI的刷新有很大帮助。是在重载成功回调中进行路径更改:

$window.location.reload().then( function success(){ $location.path('/home'); }, function error(error) {} );

大多数情况下,它会提供非常平滑的过渡,假设您在重定向到其他页面时重新启动。