Xóa lịch sử và tải lại trang khi đăng nhập / đăng xuất bằng Ionic Framework


80

Tôi là người mới phát triển ứng dụng di động với Ionic. Khi đăng nhập và đăng xuất, tôi cần tải lại trang, để làm mới dữ liệu, tuy nhiên, $state.go('mainPage')đưa người dùng trở lại chế độ xem mà không cần tải lại - bộ điều khiển đằng sau nó không bao giờ được gọi.

Có cách nào để xóa lịch sử và tải lại trạng thái trong Ionic không?

Câu trả lời:


124

Chào mừng bạn đến với khuôn khổ! Trên thực tế, định tuyến trong Ionic được cung cấp bởi ui-router . Bạn có thể nên kiểm tra câu hỏi SO trước này để tìm một vài cách khác nhau để thực hiện điều này.

Nếu bạn chỉ muốn tải lại trạng thái, bạn có thể sử dụng:

$state.go($state.current, {}, {reload: true});

Nếu bạn thực sự muốn tải lại trang (như trong, bạn muốn khởi động lại mọi thứ) thì bạn có thể sử dụng:

$window.location.reload(true)

Chúc may mắn!


Tôi muốn nhóm tất cả các tệp css / js được kéo từ máy chủ từ xa trong index.html. Nhưng tôi chỉ muốn tải lại những thứ này nếu có thay đổi. Tôi nên cấu trúc nó như thế nào?
mylord

Không chắc liệu tôi có hiểu bạn không @mylord. Bạn đang nói về tải lại trực tiếp? Có thể bạn quan tâm đến bộ nhớ cache / tệp kê khai ngoại tuyến Html5 như được thảo luận ở đây: tmkmobile.wordpress.com/2012/03/04/html5-offline-solution Tôi nghĩ bạn có thể đang cố gắng làm điều gì đó khác với mục đích ban đầu của câu hỏi.
JimTheDev

13
$ state.go ($ state.current, {}, {tải lại: true}); giải pháp này không làm việc cho tôi.
IamStalker

@IamStalker bạn có thể cung cấp thêm thông tin nào không hoặc có thể lấy ví dụ về codepen / fiddle / plunk?
JimTheDev

9
$state.go($state.current, {}, {reload: true});không hoạt động nếu cache:true(là mặc định nếu bộ nhớ cache bị bỏ qua) trong định nghĩa trạng thái. Đã thử nghiệm trong #ionic 1.0.0-RC2 và 1.0.0. Hãy xem câu trả lời của tôi.
ABCD.ca

25

Tôi thấy rằng câu trả lời của JimTheDev chỉ hoạt động khi định nghĩa trạng thái đã được cache:falseđặt. Với chế độ xem được lưu trong bộ nhớ cache, bạn có thể thực hiện $ionicHistory.clearCache()và sau đó $state.go('app.fooDestinationView')nếu bạn đang điều hướng từ trạng thái này sang trạng thái được lưu trong bộ nhớ cache nhưng cần làm mới.

Xem câu trả lời của tôi tại đây vì nó yêu cầu một thay đổi đơn giản đối với Ionic và tôi đã tạo một yêu cầu kéo: https://stackoverflow.com/a/30224972/756177


1
Đồ tốt. Tôi thực sự không sử dụng điều này trong ứng dụng ion của mình vì vậy tôi đánh giá cao việc theo dõi với chức năng bộ nhớ đệm. Có vẻ như PR của bạn sẽ chuyển sang 1.0.1. Sau khi điều đó được phát hành, tôi sẽ ghi chú trong bài đăng ban đầu của mình để ghi công bạn và nhắc mọi người xem qua.
JimTheDev

18

Câu trả lời đúng:

$window.location.reload(true);

1
Câu trả lời này đã bị gắn cờ là chất lượng thấp. Bạn có thể cố gắng giải thích tại sao nó là câu trả lời chính xác?
Jorge Leitao

1
Bởi vì nó sử dụng $windowthay vìwindow
EpokK

Bạn đúng ở chỗ nếu bạn sử dụng cú pháp .location.reload thì việc sử dụng $ window sẽ hợp lý. Tôi đã thay đổi câu trả lời của mình ở trên chỉ để chúng tôi nhất quán cho những độc giả trong tương lai. Cú pháp $ state.go cũng có thể hữu ích trong một số trường hợp nhất định.
JimTheDev

Chỉ câu trả lời này đã giúp tôi, không phải câu trả lời được đánh dấu
Michal

Tôi từng thích cách tiếp cận đó, nhưng một số người báo cáo rằng nó gây ra vòng lặp tải lại vô hạn trên một số thiết bị (Android 4.4, Chrome).
Oleg Cheremisin

18

Tôi đã tìm thấy một giải pháp giúp tôi hoàn thành nó. Đặt cache-view="false"trên ion-viewthẻ đã giải quyết vấn đề của tôi.

<ion-view cache-view="false" view-title="My Title!">
  ....
</ion-view>

vô hiệu hóa chế độ xem bộ nhớ cache làm giảm hiệu suất đáng kể, bạn nên tránh các tùy chọn này. thay vào đó, bạn có thể xử lý các sự kiện ionicView. xem: stackoverflow.com/questions/25192172/…
ezain

@ezain, Vui lòng cho tôi biết hiệu suất bị ảnh hưởng như thế nào?
Rajeshwar

@Rajeshwar, khi hệ thống bộ nhớ cache được kích hoạt, Ionic duy trì tất cả DOM được tạo bởi chế độ xem bị ẩn và khi chế độ xem thay đổi xảy ra, bạn không cần phải tính toán lại DOM. Nếu bạn có một DOM nặng và bạn cần phải tạo nó trong tất cả các thay đổi chuyển tiếp, bạn có thể đánh giá cao độ trễ trong các hoạt ảnh chuyển tiếp. Nếu bạn chỉ lý do vô hiệu hóa bộ nhớ cache là tải lại bộ điều khiển, hãy sử dụng các sự kiện ionicView.
ezain

@ezain, Có rất nhiều cách triển khai tính năng tắt bộ nhớ cache này. Tôi đã thử gần như tất cả chúng, không có gì hiệu quả với tôi. Và cái này đã cho tôi những gì tôi cần. Và tôi không thấy bất kỳ độ trễ đáng kể nào khi tải trang đó, mặc dù trang đó hơi lớn. Vì vậy, tôi thích cách này hơn những cách khác.
Rajeshwar

11

Tải lại trang không phải là cách tốt nhất.

bạn có thể xử lý các sự kiện thay đổi trạng thái để tải lại dữ liệu mà không cần tải lại chính chế độ xem.

đọc về vòng đời của ionicView tại đây:

http://blog.ionic.io/navicting-the-changes/

và xử lý sự kiện beforeEnter để tải lại dữ liệu.

$scope.$on('$ionicView.beforeEnter', function(){
  // Any thing you can think of
});

Đây có vẻ là cách tiếp cận tốt nhất.
markau

cụ thể, bạn có thể kiểm tra xem trạng thái có phải là từ bộ nhớ cache hay không và nếu có, hãy gọi một số API của bạn để làm mới nó:$scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
jakub.g

@ jakub.g nếu bạn không muốn lưu vào bộ nhớ cache của một chế độ xem, bạn có thể tắt bộ nhớ cache cho chế độ xem cụ thể này, đơn giản hơn.
ezain

6

Trong trường hợp của tôi, tôi chỉ cần xóa chế độ xem và khởi động lại bộ điều khiển. Tôi có thể đạt được ý định của mình với đoạn mã này:

$ionicHistory.clearCache([$state.current.name]).then(function() {
  $state.reload();
}

Bộ nhớ cache vẫn hoạt động và có vẻ như chỉ có chế độ xem bị xóa.

ionic --version cho biết 1.7.5.


Phụ lục: Khi trạng thái có các tham số, bạn phải xác định chúng trong chế độ xem / nhận dạng trạng thái. Kiểm tra pastebin này: pastebin.com/2CaGYpnz
glaucomorais

Lỗi trong mã của bạn Phiên bản chính xác $ ionicHistory.clearCache ([$ state.current.name]). Then (function () {$ state.reload ();});
Kirill A

Chỉ thiếu một dấu ngoặc đơn
user623396

1

Không có giải pháp nào được đề cập ở trên phù hợp với tên máy chủ khác với localhost!

Tôi đã phải thêm notify: falsevào danh sách các tùy chọn mà tôi chuyển đến $state.go, để tránh gọi người nghe thay đổi Angular, trước khi $window.location.reloadcuộc gọi được gọi. Mã cuối cùng trông giống như:

$state.go('home', {}, {reload: true, notify: false});

>>> CHỈNH SỬA - $ timeout có thể cần thiết tùy thuộc vào trình duyệt của bạn >>>

$timeout(function () { $window.location.reload(true); }, 100);

<<< HẾT CHỈNH SỬA <<<

Thông tin thêm về điều này trên tham chiếu ui-router .


0

Tôi đang cố gắng làm mới trang bằng cách sử dụng anglejs khi tôi thấy các trang web, tôi bị nhầm lẫn nhưng không có mã nào hoạt động cho mã, sau đó tôi nhận được giải pháp để tải lại trang bằng cách sử dụng

$state.go('path',null,{reload:true});

sử dụng nó trong một chức năng, nó sẽ hoạt động.


0

Tôi cần tải lại trạng thái để thanh cuộn hoạt động. Chúng không hoạt động khi đến một tiểu bang khác - 'đăng ký'. Nếu ứng dụng bị buộc đóng sau khi đăng ký và mở lại, tức là nó chuyển thẳng về trạng thái 'home', thì các thanh cuộn sẽ hoạt động. Không có giải pháp nào ở trên hoạt động.

Khi sau khi đăng ký, tôi đã thay thế:

$state.go("home");

với

window.location = "index.html"; 

Ứng dụng đã được tải lại và các thanh cuộn hoạt động.


0

Bộ điều khiển chỉ được gọi một lần và bạn NÊN duy trì mô hình logic này, điều tôi thường làm là:

Tôi tạo ra một phương pháp $scope.reload(params)

Ở phần đầu của phương pháp này, tôi gọi $ionicLoading.show({template:..})để hiển thị con quay tùy chỉnh của mình

Khi nào quá trình tải lại kết thúc, tôi có thể gọi $ionicLoading.hide() như một cuộc gọi lại

Cuối cùng, bên trong nút LÀM MỚI, tôi thêm ng-click = "reload(params)"

Nhược điểm duy nhất của giải pháp này là bạn mất hệ thống lịch sử định vị ion

Hi vọng điêu nay co ich!


0

Nếu bạn muốn tải lại sau khi thay đổi chế độ xem, bạn cần

$state.reload('state',{reload:true});

Nếu bạn muốn đặt chế độ xem đó làm "gốc" mới, bạn có thể nói với ionic rằng chế độ xem tiếp theo nó sẽ là gốc

 $ionicHistory.nextViewOptions({ historyRoot: true });
 $state.go('app.xxx');
 return;

Nếu bạn muốn tải lại bộ điều khiển của mình sau mỗi lần thay đổi chế độ xem

app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

$ionicConfigProvider.views.maxCache(0);

0

.state (url: '/ url', controller: Ctl, templateUrl: 'template.html', cache: false) cache: false ==> đã giải quyết được vấn đề của tôi!


0

Như đã chỉ ra bởi bộ điều khiển tải lại @ezain chỉ khi cần thiết. Một cách khác dễ dàng hơn để cập nhật dữ liệu khi thay đổi trạng thái thay vì tải lại bộ điều khiển là sử dụng các sự kiện truyền phát và lắng nghe các sự kiện đó trong bộ điều khiển cần cập nhật dữ liệu trên các khung nhìn.

Ví dụ: trong các chức năng đăng nhập / đăng xuất, bạn có thể thực hiện một số việc như sau:

$scope.login = function(){
    //After login logic then send a broadcast
    $rootScope.$broadcast("user-logged-in");
    $state.go("mainPage");
};
$scope.logout = function(){
   //After logout logic then send a broadcast
   $rootScope.$broadcast("user-logged-out");
   $state.go("mainPage");
};

Bây giờ trong bộ điều khiển trang chính của bạn kích hoạt các thay đổi trong chế độ xem bằng cách sử dụng chức năng $ on để nghe chương trình phát sóng trong Bộ điều khiển trang chính như sau:

$scope.$on("user-logged-in", function(){
     //update mainPage view data here eg. $scope.username = 'John';
});

$scope.$on("user-logged-out", function(){
    //update mainPage view data here eg. $scope.username = '';
});

-1

Tôi đã thử nhiều phương pháp, nhưng thấy phương pháp này hoàn toàn chính xác:

$window.location.reload();

Hy vọng điều này sẽ giúp những người khác bị mắc kẹt trong những ngày như tôi với phiên bản: angle 1.5.5, ionic 1.2.4, angle-ui-router 1.0.0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.