วิธีการใช้ history.back () ใน angular.js


191

ฉันมีคำสั่งซึ่งเป็นส่วนหัวของไซต์พร้อมปุ่มย้อนกลับและฉันต้องการให้คลิกเพื่อกลับไปยังหน้าก่อนหน้า ฉันจะทำในลักษณะที่เป็นเหลี่ยมได้อย่างไร

ฉันเหนื่อย:

<header class="title">
<a class="back" ng-class="icons"><img src="../media/icons/right_circular.png" ng-click="history.back()" /></a>
<h1>{{title}}</h1>
<a href="/home" class="home" ng-class="icons"><img src="../media/icons/53-house.png" /></a>   
</header>

และนี่คือคำสั่ง js:

myApp.directive('siteHeader', function () {
    return {
        restrict: 'E',
        templateUrl: 'partials/siteHeader.html',
        scope: {
            title: '@title',
            icons: '@icons'
        }
    };
});

แต่ไม่มีอะไรเกิดขึ้น ผมมองใน API angular.js เกี่ยวกับ$ สถานที่history.back()แต่ไม่พบอะไรเกี่ยวกับปุ่มย้อนกลับหรือ


1
คุณพูดถึงว่าสิ่งนี้ได้ผลสำหรับคุณ มันจะพาคุณไปยังหน้าต่างๆภายในแอพของคุณหรือแค่เบราว์เซอร์กลับมา ดูเหมือนว่าเบราว์เซอร์จะกลับมาหาฉัน
Chookoos

หากคุณตั้งค่า AngularJS ให้ใช้โหมด HTML5 การไปที่หน้าใด ๆ ในประวัติของเบราว์เซอร์จะใช้เวอร์ชันแคชและไม่โหลดซ้ำ โครงการที่ฉันกำลังใช้ใช้รหัสเก่ากับรหัสใหม่และหน้าก่อนหน้าจะเปลี่ยนแปลงหลังจากบันทึกข้อมูลด้วย AngularJS ไม่มีตัวเลือกในการอัพเกรดหน้าแรกให้ใช้ AngularJS ดังนั้นฉันต้องโหลดหน้าที่สามที่ไม่ใช่ AngularJS เพื่อเปลี่ยนเส้นทางกลับไปที่หน้าแรก ไม่ใช่ทางออกที่ดี แต่ใช้งานได้
CJ Dennis

คำตอบ:


262

คุณต้องใช้ฟังก์ชั่นลิงค์ในคำสั่งของคุณ:

link: function(scope, element, attrs) {
     element.on('click', function() {
         $window.history.back();
     });
 }

ดูjsFiddle


แต่ฉันมี 2 ปุ่มในส่วนหัวของฉันหนึ่งสำหรับบ้านและหนึ่งกลับถ้าฉันเข้าใจรหัสของคุณองค์ประกอบในฟังก์ชั่นการเชื่อมโยงเป็นองค์ประกอบที่ได้รับการคลิกในกรณีที่ history.back จะใช้ยังสำหรับปุ่มบ้าน? (ซึ่งไม่ดี )
baba-dev

ฉันเปลี่ยนตัวอย่างเล็กน้อย ขณะนี้มีสองปุ่ม (ย้อนกลับและไปข้างหน้า) มันใช้ jQuery ในตอนนี้ซึ่งหมายความว่าต้องใช้ $ $ () เมื่อคลิก
จนถึง

8
รหัสนี้ไม่สามารถทดสอบได้คุณควรใช้วัตถุ '$ window' แทน 'window'
ผู้ตัดสิน

ใช้งานกับ IE8 ได้หรือไม่ ฉันไม่เชื่อว่ามันมีประวัติ
นีล

5
@ Neil, Angular ภูมิใจไม่สนับสนุน IE8 ดังนั้นไม่
Rap

133

เส้นทางเชิงมุมดูตำแหน่งของเบราว์เซอร์ดังนั้นเพียงใช้window.history.back()เมื่อคลิกสิ่งที่ใช้งานได้

HTML:

<div class="nav-header" ng-click="doTheBack()">Reverse!</div>

JS:

$scope.doTheBack = function() {
  window.history.back();
};

ฉันมักจะสร้างฟังก์ชั่นระดับโลกที่เรียกว่า '$ back' ในแอพคอนโทรลเลอร์ของฉัน

angular.module('myApp').controller('AppCtrl', ['$scope', function($scope) {
  $scope.$back = function() { 
    window.history.back();
  };
}]);

จากนั้นทุกที่ในแอปของฉันฉันสามารถทำได้ <a ng-click="$back()">Back</a>

(ถ้าคุณต้องการให้ทดสอบได้มากกว่านี้ให้ฉีดบริการ $ window ลงในคอนโทรลเลอร์และใช้งาน$window.history.back())


9
ฉันไม่แนะนำให้ใส่อะไรใน "ฟังก์ชั่นระดับโลก" มีหลายสิ่งหลายอย่างที่ดีที่สามารถเกิดขึ้นกับรัฐทั่วโลก ในกรณีนี้ส่วนใหญ่จะเป็นความผันผวนของมัน รหัสจากบุคคลที่สาม (หรือนักพัฒนาอื่นหากคุณอยู่ในทีมใหญ่) โดยคำสั่งคำสั่งหรือบริการสามารถปรับเปลี่ยนขอบเขต $ ได้อย่างง่ายดาย $ กลับเพราะเป็นเด็ก ซึ่งอาจเป็นเรื่องยากที่จะแก้ปัญหา เป็นวิธีปฏิบัติที่ดีกว่าในการฉีดบริการเข้าไปในแต่ละองค์ประกอบและแสดงฟังก์ชั่นที่จำเป็น ตัวอย่างเป็นเพียง "ทั่วโลกสำหรับแอป" แต่มีความเสี่ยง
เบ็นเลช

ที่มา: ฉันมีสิ่งที่ฉันติดอยู่ในขอบเขต $ app ทั่วโลกกัดฉันหลายครั้งเกินกว่าจะนับได้และฉันหยุดใช้เทคนิคนั้นเพื่อประโยชน์ของบริการ ซึ่งยังคงสามารถอยู่ในโหมด tromped ได้
เบ็นเลช

65

ใช้คำสั่งง่าย ๆ เพื่อให้ตัวควบคุมปราศจากหน้าต่าง $ ที่ซ้ำซ้อน

app.directive('back', ['$window', function($window) {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                elem.bind('click', function () {
                    $window.history.back();
                });
            }
        };
    }]);

ใช้แบบนี้:

<button back>Back</button>

ดีใจที่คุณพบว่าการพึ่งพา $ window - สำคัญมาก
Chris Smith

20

อีกวิธีที่ดีและนำมาใช้ซ้ำคือการสร้างคำสั่งเช่นนี้ :

app.directive( 'backButton', function() {
    return {
        restrict: 'A',
        link: function( scope, element, attrs ) {
            element.on( 'click', function () {
                history.back();
                scope.$apply();
            } );
        }
    };
} );

จากนั้นใช้มันแบบนี้

<a href back-button>back</a>

1
ดูเหมือนว่าจะทำงานเมื่อคุณสั่งซื้อ curlys ปิดอีกครั้งและเปลี่ยนชื่อ directive และองค์ประกอบ attr เพื่อให้ตรงกับแต่ละอื่น ๆ
Remarsh

18

ในกรณีที่มีประโยชน์ ... ฉันกำลังกดปุ่ม "10 $ แยกย่อย () ถึงการทำซ้ำการยกเลิก!" ข้อผิดพลาดเมื่อใช้ $ window.history.back (); ด้วย IE9 (ใช้งานได้ดีในเบราว์เซอร์อื่น ๆ แน่นอน)

ฉันได้มันไปทำงานโดยใช้:

setTimeout(function() {
  $window.history.back();
},100);

คำตอบอื่น ๆ windowทำให้การใช้งานของธรรมดา คุณดูเหมือนจะใช้$windowบริการเชิงมุม บางทีนี่อาจเป็นต้นเหตุหรือ
superjos

7
ฉันได้รับข้อผิดพลาดเดียวกันภายใต้ IE9 และสิ่งนี้แก้ปัญหาได้ ดูgithub.com/angular/angular.js/issues/1417เขาถูกต้องเกี่ยวกับการใช้ $ window คำตอบอื่น ๆ ทั้งหมดคือ "ผิด" ในจุดนี้ดูdocs.angularjs.org/api/ng.$window
tanguy_k

ความคิดเกี่ยวกับทำไม 100ms? มันค่อนข้างล่าช้ามันใช้งานได้น้อยลงหรือไม่
Kevin

@ เควิน 100ms เป็นเพียงช่วงเวลาที่ฉันคิดว่ามีเหตุผลและ imo ไม่สังเกตเห็นได้ชัด อันที่จริงการล่าช้าเล็กน้อยอาจได้ผล
Rob Bygrave

ฉันพบปัญหาที่คล้ายกันใน Chrome ล่าสุดเมื่อใช้การนำทางที่เป็นค่าเริ่มต้นของ Angular ในแอปของฉันและความล่าช้าจะไม่ช่วยได้เช่นกัน เฉพาะการปิดใช้งานการจัดการการนำทางของ Angularช่วย
Domi

3

หรือคุณสามารถใช้ รหัส:

onClick="javascript:history.go(-1);"

ชอบ:

<a class="back" ng-class="icons">
   <img src="../media/icons/right_circular.png" onClick="javascript:history.go(-1);" />
</a>

1
สิ่งนี้ดูผิดในหลาย ๆ ระดับ cf โพสต์บล็อกนี้จากเกือบ 10 ปีที่แล้ว
Rocco

1

มีข้อผิดพลาดทางไวยากรณ์ ลองสิ่งนี้และมันควรจะได้ผล:

directives.directive('backButton', function(){
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind('click', function () {
                history.back();
                scope.$apply();
            });
        }
    }
});

1

เชิงมุม 4:

/* typescript */
import { Location } from '@angular/common';
// ...

@Component({
  // ...
})
export class MyComponent {

  constructor(private location: Location) { } 

  goBack() {
    this.location.back(); // go back to previous location
  }
}

0

สำหรับฉันปัญหาของฉันคือฉันต้องนำทางกลับแล้วเปลี่ยนไปใช้สถานะอื่น ดังนั้นการใช้$window.history.back()ไม่ได้เพราะเหตุผลบางอย่างการเปลี่ยนแปลงเกิดขึ้นก่อน history.back () เกิดขึ้นดังนั้นฉันจึงต้องปิดการเปลี่ยนแปลงของฉันในฟังก์ชั่นหมดเวลาเช่นนั้น

$window.history.back();
setTimeout(function() {
  $state.transitionTo("tab.jobs"); }, 100);

นี่เป็นการแก้ไขปัญหาของฉัน


0

ใน AngularJS2 ฉันพบวิธีใหม่อาจจะเป็นสิ่งเดียวกัน แต่ในเวอร์ชั่นใหม่นี้:

import {Router, RouteConfig, ROUTER_DIRECTIVES, Location} from 'angular2/router'; 

(...)

constructor(private _router: Router, private _location: Location) {}

onSubmit() {
    (...)
    self._location.back();
}

หลังจากฟังก์ชั่นของฉันฉันจะเห็นว่าแอปพลิเคชันของฉันกำลังไปยังตำแหน่ง usgin หน้าก่อนหน้าจาก angular2 / เราเตอร์

https://angular.io/docs/ts/latest/api/common/index/Location-class.html


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