AngularJs: โหลดหน้าใหม่


คำตอบ:


265

คุณสามารถใช้reloadวิธีการของ$routeบริการ ฉีด$routeเข้าไปในคอนโทรลเลอร์ของคุณแล้วสร้างวิธีการreloadRouteใน$scopeไฟล์.

$scope.reloadRoute = function() {
   $route.reload();
}

จากนั้นคุณสามารถใช้งานได้ในลิงค์ดังนี้:

<a ng-click="reloadRoute()" class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

วิธีนี้จะทำให้เส้นทางปัจจุบันโหลดซ้ำ อย่างไรก็ตามหากคุณต้องการทำการรีเฟรชแบบเต็มคุณสามารถฉีด$windowและใช้สิ่งนั้น:

$scope.reloadRoute = function() {
   $window.location.reload();
}


แก้ไขภายหลัง (ui-router):

ตามที่ JamesEddyEdwards และ Dunc กล่าวไว้ในคำตอบหากคุณใช้angular-ui / ui-routerคุณสามารถใช้วิธีการต่อไปนี้เพื่อโหลดสถานะ / เส้นทางปัจจุบันใหม่ เพียงฉีด$stateแทน$routeแล้วคุณจะมี:

$scope.reloadRoute = function() {
    $state.reload();
};

2
นี่เป็นคำตอบที่ดีหากคุณหมดหวังที่จะโหลดซ้ำแบบ Angularise
spikeheap

ฉันจะเปลี่ยนพฤติกรรมนี้ทั่วโลกแทนการเพิ่มการดำเนินการในลิงก์ทั้งหมดได้อย่างไร
OMGPOP

@OMGPOP ทั่วโลกหมายถึงอะไรสำหรับลิงก์ทั้งหมด
Alexandrin Rus

ฉันหมายถึงสำหรับลิงก์ทั้งหมดที่คุณต้องทำสิ่งนี้ เป็นไปได้ไหมที่จะกำหนดค่าหนึ่งครั้งสำหรับลิงก์ทั้งหมด
OMGPOP

@AlexandrinRus นี่คือการทำซ้ำ [$ rootScope: infdig] 10 $ Digest () ซ้ำถึงแล้ว แท้ง!
alphapilgrim

52

windowมีให้บริการผ่านทาง$windowบริการเพื่อการทดสอบและการเยาะเย้ยที่ง่ายขึ้นคุณสามารถทำสิ่งต่างๆเช่น:

$scope.reloadPage = function(){$window.location.reload();}

และ:

<a ng-click="reloadPage"  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

ตามหมายเหตุด้านข้างฉันไม่คิดว่า $ route.reload () จะโหลดหน้าเว็บซ้ำแต่เฉพาะเส้นทางเท่านั้น


2
ขอแนะนำให้ใช้$windowแทนwindow.
Jeroen

ขอบคุณสำหรับการสนับสนุนของคุณ คุณช่วยอธิบายเราได้ไหมว่าทำไม?
Florian F.

1
ใช่ขอโทษ. มันเป็นเรื่องที่ดีที่สุดที่อธิบายไว้โดยเอกสารส่วนใหญ่จะเป็นเพราะจะเป็น (ดีกว่า) ที่สามารถทดสอบได้เมื่อใช้ $windowreloadPage$window
Jeroen

20
 location.reload(); 

เคล็ดลับไม่

<a ng-click="reload()">

$scope.reload = function()
{
   location.reload(); 
}

ไม่จำเป็นต้องมีเส้นทางหรืออะไรแค่ js เก่า ๆ ธรรมดา ๆ


2
รักความเรียบง่าย!
Shawn de Wet

14

คล้ายกับคำตอบของ Alexandrin แต่ใช้ $ state มากกว่า $ route:

(จากคำตอบ SO ของ JimTheDev ที่นี่ )

$scope.reloadState = function() {
   $state.go($state.current, {}, {reload: true});
}

<a ng-click="reloadState()" ... 

9

หากใช้ui-routerขั้นสูงของ Angulars ซึ่งฉันขอแนะนำอย่างแน่นอนตอนนี้คุณสามารถใช้:

$state.reload();

ซึ่งโดยพื้นฐานแล้วจะทำเช่นเดียวกับคำตอบของ Dunc


5

วิธีแก้ปัญหาของฉันในการหลีกเลี่ยงการวนซ้ำแบบไม่มีที่สิ้นสุดคือการสร้างสถานะอื่นที่ทำให้การเปลี่ยนเส้นทาง:

$stateProvider.state('app.admin.main', {
    url: '/admin/main',
    authenticate: 'admin',
    controller: ($state, $window) => {
      $state.go('app.admin.overview').then(() => {
        $window.location.reload();
      });
    }
  });

2

เชิงมุม 2+

ฉันพบสิ่งนี้ขณะค้นหา Angular 2+ ดังนั้นนี่คือวิธี:

$window.location.reload();

1
สิ่งนี้ไม่ได้เจาะจงเฉพาะเชิงมุมโดยวิธีการทางจาวาสคริปต์
Nitin Jadhav

1

ง่ายพอที่จะใช้$route.reload()(อย่าลืมฉีด $ route เข้าไปในคอนโทรลเลอร์ของคุณ) แต่จากตัวอย่างของคุณคุณสามารถใช้ "href" แทน "ng-href":

<a href=""  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

คุณจำเป็นต้องใช้ ng-href เพื่อปกป้องผู้ใช้จากลิงก์ที่ไม่ถูกต้องซึ่งเกิดจากการคลิกก่อนที่ Angular จะแทนที่เนื้อหาของแท็ก {{}}


$ route เป็นส่วนหนึ่งของ ng.route.IRouteService ??
ข้าวเกรียบ

1

บน Angular 1.5 - หลังจากลองใช้วิธีแก้ปัญหาข้างต้นบางส่วนแล้วต้องการโหลดซ้ำเฉพาะข้อมูลโดยไม่มีการรีเฟรชแบบเต็มหน้าฉันมีปัญหาในการโหลดข้อมูลอย่างถูกต้อง ฉันสังเกตว่าเมื่อฉันไปที่เส้นทางอื่นแล้วฉันกลับไปที่ปัจจุบันทุกอย่างทำงานได้ดี แต่เมื่อฉันต้องการโหลดเฉพาะเส้นทางปัจจุบันโดยใช้$route.reload()รหัสบางส่วนจะไม่ทำงานอย่างถูกต้อง จากนั้นฉันพยายามเปลี่ยนเส้นทางไปยังเส้นทางปัจจุบันด้วยวิธีต่อไปนี้:

$scope.someFuncName = function () {
    //go to another route
    $location.path('/another-route');
};

และในการกำหนดค่าโมดูลให้เพิ่มอีกwhen:

.config(['$routeProvider', function($routeProvider) {
     $routeProvider.when('/first-page', {
         templateUrl: '/first-template',
         controller: 'SomeCtrl'
     }).when('/another-route', {//this is the new "when"
         redirectTo: '/first-page'
     });
}])

และมันก็ใช้ได้ดีสำหรับฉัน ไม่รีเฟรชทั้งหน้า แต่ทำให้ตัวควบคุมและเทมเพลตปัจจุบันโหลดซ้ำเท่านั้น ฉันรู้ว่ามันค่อนข้างแฮ็ค แต่นั่นเป็นทางออกเดียวที่ฉันพบ


วิธีที่ง่ายกว่านั้นvar reload = $location.url(); $location.url(''); $timeout(function() { $location.url(reload); });คือ ไม่จำเป็นต้องสร้างเส้นทางแบบสุ่ม แต่มันน่าสนใจที่จะดูว่าโค้ดใดที่ไม่ได้ประเมินซ้ำสำหรับคุณ ดูเหมือนว่าแม้แต่redirectTos และresolveฟังก์ชั่นจะดำเนินการซ้ำตามปกติ$route.reload() (ดูที่ console.log)
Hashbrown

1
<a title="Pending Employee Approvals" href="" ng-click="viewPendingApprovals(1)">
                    <i class="fa fa-user" aria-hidden="true"></i>
                    <span class="button_badge">{{pendingEmployeeApprovalCount}}</span>
                </a>

และในตัวควบคุม

 $scope.viewPendingApprovals = function(type) {
                if (window.location.hash.substring(window.location.hash.lastIndexOf('/') + 1, window.location.hash.length) == type) {
                    location.reload();
                } else {
                    $state.go("home.pendingApproval", { id: sessionStorage.typeToLoad });
                }
            };

และในไฟล์เส้นทาง

.state('home.pendingApproval', {
        url: '/pendingApproval/:id',
        templateUrl: 'app/components/approvals/pendingApprovalList.html',
        controller: 'pendingApprovalListController'
    })

ดังนั้นหากรหัสที่ส่งผ่านใน url เหมือนกับสิ่งที่มาจากฟังก์ชันที่เรียกโดยการคลิกจุดยึดจากนั้นก็โหลดซ้ำไม่เช่นนั้นจะตามเส้นทางที่ร้องขอ

โปรดช่วยฉันปรับปรุงคำตอบนี้หากเป็นประโยชน์ ข้อเสนอแนะใด ๆ ยินดีต้อนรับ


ฉันใช้เวลาหนึ่งเดือนในการหาคำตอบว่าเหตุใดจึงไม่โหลดหน้าเว็บใหม่
sam

0

สามารถทำได้โดยการเรียกใช้เมธอด reload () ของอ็อบเจ็กต์หน้าต่างใน JavaScript ธรรมดา

window.location.reload();


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.