2014-04-03 27 views
15

Trong ứng dụng AngularJS của tôi, tôi có một dịch vụ dựa trên WebSocket. Nếu kết nối WebSocket bị hỏng, tôi muốn hoàn toàn 'khởi động lại' ứng dụng (đi tới trang mặc định từ $ route, tạo lại dịch vụ, v.v.). Điều đó có thể đạt được không? Đây là cách tôi bắt đầu, nhưng từ thời điểm đó tôi không có ý tưởng làm thế nào để tiến hành:Cách 'khởi động lại' ứng dụng angularjs

Module:

(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' 
      }); 
     }]); 
}()); 

dịch vụ:

(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); 
     }; 

    }]); 
}()); 

Bộ điều khiển:

(function() { 

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

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

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

Vì vậy, như 'logic khởi động lại' của tôi, tôi đã thử "$ route.reload();" nhưng như bạn đã biết nó không làm những gì tôi cần. Cuối cùng tôi sẽ có một thông điệp cảnh báo bật lên (bootstrap phương thức) thông báo cho người dùng rằng kết nối đã bị mất, và trên một nút bấm trong phương thức đó, nó sẽ tải lại ứng dụng và đi đến/home. Tôi không hỏi làm thế nào để làm điều đó popup vv như thế này đã được thực hiện. Tuy nhiên, bây giờ, tôi chỉ cần tìm ra logic để tải lại toàn bộ ứng dụng. Bất kỳ ý tưởng? Cảm ơn.

+0

Tôi chắc chắn có những câu trả lời tốt hơn, nhưng tôi thực sự đã gặp vấn đề này với 'ui-router' ở độ phân giải được đề xuất không hoạt động đúng với tôi (nó chỉ tải lại bộ điều khiển lượt xem) Vì vậy, tôi đã phải nghỉ mát để javascript tinh khiết, lần đầu tiên kiểm tra '$ vị trí. $$ absUrl', nếu trên" trang bắt đầu "tôi chỉ cần làm một' location.reload() ', khác tôi chỉ' window.location = '/ home ''. – jnthnjns

+0

Tại sao phải tải lại toàn bộ ứng dụng? Sẽ không kết nối lại đủ? –

+0

Tôi có một số trạng thái được lưu trong ứng dụng và cũng như kết nối lại tôi muốn đặt lại trạng thái đó. Thay vì thay đổi 20 biến phạm vi thành giá trị mặc định, tôi có thể khởi động lại toàn bộ ứng dụng. Tôi biết nó không phải là cách tốt nhất, nhưng sẽ phải làm ngay bây giờ. –

Trả lời

31

Để trả lời câu hỏi của riêng tôi, đạt được với một thử và sai:

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

này sẽ được chuyển tới/home (mặc định) và tải lại tất cả mọi thứ, do đó tạo ra dịch vụ mới, mô-đun, điều khiển vv Nếu có một cách tốt hơn để làm điều đó (nếu tôi thay đổi đường dẫn mặc định thành/blah trong mô-đun của tôi, điều này sẽ không chọn nó và do đó tôi cũng sẽ phải chỉnh sửa mã này), hãy cho tôi biết :)

+1

Có ai có một giải pháp khác cho vấn đề này không? Mã trên hoạt động, nhưng bạn thấy trạng thái chuyển đổi ứng dụng trước khi tải lại trang ... loại UX – JLewkovich

+1

xấu này sẽ hoạt động nếu bạn không lưu trữ bất kỳ dữ liệu nào trong cookie, localStorage hoặc sessionStorage, nếu bạn sử dụng bất kỳ dữ liệu nào trong số này, bạn sẽ cần để đặt lại giá trị về giá trị mặc định của chúng –

8

Tôi đã đạt được cùng một điều làm:

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

Một chút tinh chỉnh tôi đã làm cho câu trả lời của bạn đã giúp rất nhiều với giao diện người dùng làm mới. Là để làm thay đổi đường dẫn bên trong gọi lại tải lại thành công:

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

Phần lớn thời gian nó mang lại một sự chuyển tiếp rất mịn, giả sử bạn đang khởi động lại trong khi chuyển hướng đến một trang khác.

Các vấn đề liên quan