Làm thế nào để tải lại trạng thái hiện tại?


333

Tôi đang sử dụng Bộ định tuyến giao diện người dùng Angular và muốn tải lại trạng thái hiện tại và làm mới tất cả dữ liệu / chạy lại bộ điều khiển cho trạng thái hiện tại và đó là cha mẹ.

Tôi có 3 cấp độ nhà nước: thư mục. Organisations.details

thư mục. tổ chức chứa một bảng với một danh sách các tổ chức. Nhấp vào một mục trong bảng sẽ tải thư mục. Organisations.details với $ StateParams chuyển ID của mục đó. Vì vậy, trong trạng thái chi tiết, tôi tải các chi tiết cho mục này, chỉnh sửa chúng và sau đó lưu dữ liệu. Tất cả đều ổn cho đến nay.

Bây giờ tôi cần tải lại trạng thái này và làm mới tất cả dữ liệu.

Tôi đã thử:

 $state.transitionTo('directory.organisations');

Đi đến trạng thái cha mẹ nhưng không tải lại bộ điều khiển, tôi đoán vì đường dẫn không thay đổi. Lý tưởng nhất là tôi chỉ muốn ở trong trạng thái thư mục. Organisations.details và làm mới tất cả dữ liệu trong cha mẹ.

Tôi cũng đã thử:

$state.reload()

Tôi đã thấy điều này trên API WIKI với giá $ state.reload "(lỗi với bộ điều khiển khôi phục lại ngay bây giờ, sẽ sớm sửa)."

Bất kỳ trợ giúp sẽ được đánh giá cao?


7
Tôi đã giải quyết vấn đề này như sau: $ state.transitionTo ($ state.c Hiện tại, $ stateParams, {reload: true, thừa kế: false, thông báo: true});
Hà Lan Risley

1
Thêm mã này vào đâu?
Manoj G

Vậy lỗi này đã được sửa chưa? github.com/angular-ui/ui-router/wiki/ từ
jchnxu

$state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})nên được thêm vào đâu? Có vấn đề tương tự với tải lại trạng thái của tôi là mất tất cả dữ liệu.
Evan Burbidge

Câu trả lời:


565

Tôi thấy đây là cách làm việc ngắn nhất để làm mới với ui-router:

$state.go($state.current, {}, {reload: true}); //second parameter is for $stateParams

Cập nhật cho các phiên bản mới hơn:

$state.reload();

Đó là một bí danh cho:

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: true
});

Tài liệu: https://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state#methods_reload


21
Có lẽ đáng lưu ý rằng không ai trong số này thực sự tải lại trang là tốt. Nếu bạn muốn tải lại trạng thái VÀ trang, ui-routertôi nghĩ không có phương pháp nào cho nó. Làm window.location.reload(true).
SimplGy

15
@SimpleAsCouldBe nếu bạn muốn góc cạnh hơn về nó bạn có thể làm $window.location.reload();. Mặc dù điều này có vẻ hơi quá mức nhưng nó có thể làm cho việc kiểm tra / chế nhạo / biết tất cả các phụ thuộc một đoạn mã có mọi thứ dễ dàng hơn một chút.
edhedges

1
Chỉ tò mò, chính xác "$ state.c Hiện tại" nghĩa là gì? Tôi không thể thấy giải thích rõ ràng về API của ui-router, mọi trợ giúp sẽ được đánh giá cao, cảm ơn!
dùng2499325

3
@ user2499325: $ state.c hiện trả về một đối tượng có tất cả dữ liệu bạn có trong stateProvider: `` `{url:" / place /: placeId ", bộ điều khiển:" NewPlaceContoder ", controlAs:" placeVM ", templateUrl:" /new.place/new.place.details.html ", tên:" index.places.placeDetails "}` ``
Xavier Haniquaut

1
Bạn có thể thay thế {} bằng $ stateParams nếu bạn đã tải các tham số như: $ state.go ($ state.cản, $ stateParams, {reload: true});
tsuz

154

Giải pháp này hoạt động trong AngularJS V.1.2.2:

$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});

8
Bạn sẽ thêm cái này ở đâu để nó không gây ra một vòng lặp vô hạn?
Pathsofdesign

5
Điều này sẽ giải quyết lại các resolvemục của nhà nước?
TheSharpieOne

7
Ngoài ra, bạn sẽ không phải tiêm $ stateParams nếu bạn thay đổi cuộc gọi đó thành $ state.params
Jeff Ancel

4
Hoạt động tốt hơn nhiều so với câu trả lời được bình chọn cao nhất hiện tại, thực sự tải lại trang. Nếu bạn có vấn đề vòng lặp vô hạn, tải lại của bạn có thể ở sai vị trí. Tôi chỉ sử dụng nó trên một nút bấm
Dan

2
Một chút muộn cho @ManojG nhưng bạn sẽ đặt mã này bất cứ nơi nào bạn cần để tải lại - có thể trong một hàm chỉ thị ng-click hoặc sự kiện khác. Không nên thực hiện trên mỗi lần tải trang vì lý do rõ ràng (vòng lặp vô hạn)
sricks

68

Đó sẽ là giải pháp cuối cùng. (lấy cảm hứng từ bài đăng của @ Hollan_Risley)

'use strict';

angular.module('app')

.config(function($provide) {
    $provide.decorator('$state', function($delegate, $stateParams) {
        $delegate.forceReload = function() {
            return $delegate.go($delegate.current, $stateParams, {
                reload: true,
                inherit: false,
                notify: true
            });
        };
        return $delegate;
    });
});

Bây giờ, bất cứ khi nào bạn cần tải lại, chỉ cần gọi:

$state.forceReload();

6
vòng lặp chết chóc
CS

6
Âm thanh như bạn có một thiết bị chặn ở đâu đó được kích hoạt. Tôi đã thử nghiệm giải pháp này nhiều lần và nó hoạt động tốt.
MK

2
@MK Cảm ơn bạn đã lưu ý. Nó hướng tôi đến giải pháp cho vấn đề khác, của riêng tôi. Tôi đã dành hàng giờ cố gắng để tìm hiểu lý do tại sao các yêu cầu của tôi tăng gấp đôi, sau đó tăng gấp ba, v.v. và tất cả chỉ vì một thiết bị chặn ( github.com/witoldsz/angular-http-auth ).
Maciej Gurban

57

cho khung ion

$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload

$stateProvider.
  state('home', {
    url: '/',
    cache: false, //required

https://github.com/angular-ui/ui-router/issues/582


Hoạt động tốt cho tôi khi $state.gokhông chuyển hướng đến trạng thái mới. Cảm ơn @RouR. Cứu ngày của tôi.
Guillaume Wuip

Tôi nghĩ thay thế $ state.go bằng $ state.transitionTo. Vì vậy, bất cứ nơi nào bạn đã gọi $ state.go, chỉ cần thay thế nó. Nó có thể trông giống như $ state.transitionTo ('tab-name', {key: value}, {reload: true, thừa kế: true, thông báo: true}
Bill Pope

2
cache: false không lừa .. nhưng nó ảnh hưởng đến hiệu năng bao nhiêu?
FrEaKmAn

thay đổi $ state.go bằng $ state.transitionĐể thay đổi trạng thái và tải lại @ManojG
Gery

Tôi có phải bao gồm một số thư viện mới để sử dụng $statekhông? Tôi đang chạy ion 1.4.0, góc 1.5.3
josinalvo

45

Có lẽ cách tiếp cận sạch hơn sẽ là như sau:

<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>

Chúng tôi chỉ có thể tải lại trạng thái từ HTML.


7
Bạn cũng có thể sử dụng ui-sref-opts = "{tải lại: 'child.state'}" để tránh tải lại toàn bộ trang, trong đó 'child.state' là một chuỗi biểu thị trạng thái thực của bạn.
Michael Fulton




7

nếu bạn muốn tải lại toàn bộ trang của mình, có vẻ như vậy, chỉ cần đưa cửa sổ $ vào bộ điều khiển của bạn và sau đó gọi

$window.location.href = '/';

nhưng nếu bạn chỉ muốn tải lại chế độ xem hiện tại của mình, hãy nhập $ scope, $ state và $ stateParams (sau này trong trường hợp bạn cần thay đổi một số tham số trong lần tải lại sắp tới này, giống như số trang của bạn), thì hãy gọi nó trong bất kỳ phương pháp điều khiển:

$stateParams.page = 1;
$state.reload();

AngularJS v1.3.15 angular-ui-router v0.2.15


6

Cách giải quyết ngớ ngẩn luôn luôn hoạt động.

$state.go("otherState").then(function(){
     $state.go("wantedState")
});

3

Đối với v1.2.26 góc, không có công trình nào ở trên. Một lần nhấp ng gọi các phương thức trên sẽ phải được bấm hai lần để thực hiện tải lại trạng thái.

Vì vậy, tôi đã kết thúc việc mô phỏng 2 lần nhấp bằng cách sử dụng $ timeout.

$provide.decorator('$state',
        ["$delegate", "$stateParams", '$timeout', function ($delegate, $stateParams, $timeout) {
            $delegate.forceReload = function () {
                var reload = function () {
                    $delegate.transitionTo($delegate.current, angular.copy($stateParams), {
                        reload: true,
                        inherit: true,
                        notify: true
                    })
                };
                reload();
                $timeout(reload, 100);
            };
            return $delegate;
        }]);

Navigation.reload () yêu cầu hai lần nhấp với Angular 1.3.0-rc0, nhưng quá trình chuyển đổi () hoạt động tốt. Có thể thử nâng cấp nếu bạn gặp sự cố này
sricks


3

Không chắc chắn tại sao không ai trong số này dường như làm việc cho tôi; người cuối cùng đã làm điều đó là:

$state.reload($state.current.name);

Đây là với Angular 1.4.0


2

Tôi đã có nhiều lượt xem lồng nhau và mục tiêu là chỉ tải lại một lượt xem có nội dung. Tôi đã thử các cách tiếp cận khác nhau nhưng điều duy nhất hiệu quả với tôi là:

//to reload
$stateParams.reload = !$stateParams.reload; //flip value of reload param
$state.go($state.current, $stateParams);

//state config
$stateProvider
  .state('app.dashboard', {
    url: '/',
    templateUrl: 'app/components/dashboard/dashboard.tmpl.html',
    controller: 'DashboardController',
    controllerAs: 'vm',
    params: {reload: false} //add reload param to a view you want to reload
  });

Trong trường hợp này, chỉ cần xem sẽ được tải lại và bộ nhớ đệm vẫn hoạt động.


tải lại đúng hoặc sai, u đề cập là sai. sai sẽ tải lại nội dung với những thay đổi mới nhất?
cụt

2

Tôi biết đã có một loạt các câu trả lời nhưng cách tốt nhất tôi đã tìm thấy để làm điều này mà không gây ra làm mới toàn trang là tạo một tham số giả trên tuyến đường mà tôi muốn làm mới và sau đó khi tôi gọi tuyến đường tôi đi qua số ngẫu nhiên để tham số giả.

            .state("coverage.check.response", {
                params: { coverageResponse: null, coverageResponseId: 0, updater: 1 },
                views: {
                    "coverageResponse": {
                        templateUrl: "/Scripts/app/coverage/templates/coverageResponse.html",
                        controller: "coverageResponseController",
                        controllerAs: "vm"
                    }
                }
            })

và sau đó gọi đến tuyến đường đó

$state.go("coverage.check.response", { coverageResponse: coverage, updater: Math.floor(Math.random() * 100000) + 1 });

Hoạt động như một nét duyên dáng và xử lý các quyết tâm.


2

Bạn có thể sử dụng câu trả lời @Rohan https://stackoverflow.com/a/23609343/3297761

Nhưng nếu bạn muốn làm cho mỗi bộ điều khiển tải lại sau khi thay đổi chế độ xem, bạn có thể sử dụng

myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }

2

Nếu bạn đang sử dụng ionic v1, giải pháp trên sẽ không hoạt động vì ionic đã kích hoạt bộ đệm ẩn mẫu như là một phần của $ ionicConfigProvider.

Làm việc xung quanh đó là một chút hacky - bạn phải đặt bộ đệm thành 0 trong tệp ionic.angular.js:

$ionicConfigProvider.views.maxCache(0);

1

Tôi gặp vấn đề này, nó đã phá hỏng đầu tôi, định tuyến của tôi được đọc từ một tệp JSON và sau đó được đưa vào một lệnh. Tôi có thể nhấp vào trạng thái ui nhưng tôi không thể tải lại trang. Vì vậy, một đồng nghiệp của tôi đã chỉ cho tôi một mẹo nhỏ hay cho nó.

  1. Nhận dữ liệu của bạn
  2. Trong cấu hình ứng dụng của bạn, hãy tạo trạng thái tải
  3. Lưu trạng thái bạn muốn đi đến trong rootscope.
  4. Đặt vị trí của bạn thành "/ đang tải" trong ứng dụng của bạn.
  5. Trong bộ điều khiển tải giải quyết lời hứa định tuyến và sau đó đặt vị trí cho mục tiêu dự định của bạn.

Điều này làm việc cho tôi.

Hy vọng nó giúp

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.