Cara menerapkan history.back () di angular.js

191

Saya memiliki arahan yang merupakan tajuk situs dengan tombol kembali dan saya ingin di klik untuk kembali ke halaman sebelumnya. Bagaimana saya melakukannya dengan sudut pandang?

Saya telah mencoba:

<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>

dan ini adalah arahan js:

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

tetapi tidak ada yang terjadi. Saya melihat di API angular.js tentang $ location tetapi tidak menemukan apa pun tentang tombol kembali atau history.back().

baba-dev
sumber
1
Anda menyebutkan bahwa ini berhasil untuk Anda. Apakah itu membawa Anda ke halaman berbeda dalam aplikasi Anda atau hanya apakah browser kembali? Sepertinya browser kembali ke saya.
Chookoos
Jika Anda telah mengatur AngularJS untuk menggunakan mode HTML5, pergi ke halaman yang sudah ada dalam riwayat browser akan menggunakan versi yang di- cache dan tidak memuatnya kembali. Proyek yang saya kerjakan menggunakan campuran kode lama dan baru, dan halaman sebelumnya berubah setelah data disimpan dengan AngularJS. Ini bukan opsi untuk memutakhirkan halaman pertama untuk menggunakan AngularJS jadi saya harus memuat halaman ketiga, non-AngularJS untuk mengarahkan kembali ke yang pertama. Bukan solusi yang bagus, tetapi berhasil.
CJ Dennis

Jawaban:

262

Anda perlu menggunakan fungsi tautan dalam arahan Anda:

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

Lihat jsFiddle .

Asgoth
sumber
Tetapi saya memiliki 2 tombol di header saya satu untuk rumah dan satu untuk kembali jika saya mengerti kode Anda elemen dalam fungsi tautan adalah elemen yang diklik dalam case history.back akan berlaku juga untuk tombol home? (Yang tidak baik )
baba-dev
Saya telah sedikit mengubah contoh. Sekarang ada dua tombol (mundur dan maju). Ia menggunakan jQuery sekarang, yang berarti ruang lingkup. $ Apply () diperlukan saat klik.
asgoth
8
Kode ini tidak dapat diuji, Anda harus benar-benar menggunakan objek '$ window' alih-alih 'window.'
Arbiter
Apakah ini bekerja dengan IE8? Saya tidak percaya ini memiliki sejarah
Neil
5
@ Neil, Angular dengan bangga tidak mendukung IE8. Jadi tidak.
Rap
133

Rute sudut menonton lokasi peramban, jadi hanya dengan window.history.back()mengklik sesuatu akan berhasil.

HTML:

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

JS:

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

Saya biasanya membuat fungsi global yang disebut '$ kembali' pada pengontrol aplikasi saya, yang biasanya saya taruh di tag tubuh.

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

Lalu di mana saja di aplikasi saya yang bisa saya lakukan <a ng-click="$back()">Back</a>

(Jika Anda ingin itu lebih dapat diuji, masukkan layanan $ window ke controller Anda dan gunakan $window.history.back()).

Andrew Joslin
sumber
9
Saya akan merekomendasikan untuk tidak meletakkan apa pun dalam "fungsi global". Ada banyak hal hebat yang dapat terjadi pada negara global . Dalam hal ini sebagian besar volatilitasnya. Kode dari pihak ketiga (atau pengembang lain, jika Anda berada di tim besar) di katakanlah, arahan, atau layanan dapat dengan mudah mengubah $ lingkup. $ Kembali untuk anak-anak itu. Yang bisa jadi sulit untuk di-debug. Ini pasti praktik yang lebih baik untuk menyuntikkan layanan ke setiap komponen, dan mengekspos fungsionalitas di mana diperlukan. Contohnya hanya "global ke aplikasi", tetapi ada risiko
Ben Lesh
Sumber: Saya memiliki hal-hal yang saya terjebak dalam aplikasi $ lingkup "global" menggigit saya terlalu banyak untuk dihitung, dan saya telah berhenti menggunakan teknik itu untuk layanan. Yang masih bisa diinjak-injak, tetapi cara ini lebih mudah untuk disingkirkan.
Ben Lesh
65

Idealnya gunakan arahan sederhana untuk menjaga pengontrol bebas dari $ window yang berlebihan

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

Gunakan seperti ini:

<button back>Back</button>
Darren
sumber
Senang Anda menunjukkan ketergantungan $ window - itu penting.
Chris Smith
20

Solusi bagus dan dapat digunakan kembali adalah dengan membuat arahan seperti ini :

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

maka gunakan saja seperti ini:

<a href back-button>back</a>
pleerock
sumber
1
Tampaknya berfungsi setelah Anda menyusun ulang keriting penutup dan mengganti nama arahan dan elemen attr untuk mencocokkan satu sama lain.
Remarsh
18

Jika berguna, saya mencapai "iterasi 10 $ digest () tercapai. Batalkan!" kesalahan saat menggunakan $ window.history.back (); dengan IE9 (berfungsi dengan baik di browser lain tentu saja).

Saya membuatnya bekerja dengan menggunakan:

setTimeout(function() {
  $window.history.back();
},100);
Rob Bygrave
sumber
Jawaban lain menggunakan polos window. Anda tampaknya menggunakan $windowlayanan Angular. Mungkin ini adalah akar masalahnya?
superjos
7
Saya mendapat kesalahan yang sama di bawah IE9 dan ini memecahkan masalah. Lihat github.com/angular/angular.js/issues/1417 Dia benar tentang menggunakan $ window, semua jawaban lain "salah" pada poin ini, lihat docs.angularjs.org/api/ng.$window
tanguy_k
Tahu mengapa 100ms? Itu agak keterlambatan, apakah itu bekerja dengan lebih sedikit?
Kevin
@ Kinev The 100ms hanya durasi yang saya pikir masuk akal dan imo tidak terlihat. Memang penundaan yang lebih kecil mungkin berhasil.
Rob Bygrave
Saya mendapatkan masalah serupa di Chrome terbaru saat menggunakan navigasi standar Angular di aplikasi saya, dan penundaan itu juga tidak membantu. Hanya menonaktifkan manajemen navigasi Angular yang membantu.
Domi
3

Atau Anda cukup menggunakan kode:

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

Suka:

<a class="back" ng-class="icons">
   <img src="../media/icons/right_circular.png" onClick="javascript:history.go(-1);" />
</a>
Arvind Kushwaha
sumber
1
ini terlihat salah pada banyak tingkatan, lih. posting blog ini dari hampir 10 tahun yang lalu
Rocco
1

Terjadi kesalahan sintaksis. Coba ini dan itu akan berhasil:

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

Sudut 4:

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

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

  constructor(private location: Location) { } 

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

Bagi saya, masalah saya adalah saya harus menavigasi kembali dan kemudian beralih ke negara lain. Jadi menggunakan $window.history.back()tidak berfungsi karena untuk beberapa alasan transisi terjadi sebelum history.back () terjadi sehingga saya harus membungkus transisi saya dalam fungsi batas waktu seperti itu.

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

Ini memperbaiki masalah saya.

deb2fast
sumber
0

Di AngularJS2 saya menemukan cara baru, mungkin hal yang sama tetapi dalam versi baru ini:

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

(...)

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

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

Setelah fungsi saya, saya dapat melihat bahwa aplikasi saya pergi ke halaman sebelumnya menggunakan lokasi dari angular2 / router.

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

Paul Leclerc
sumber
Berhasil, Anda harus mengimpornya dari @ angular / common, bukan @ angular / router.
plexus