angular.js에서 history.back ()을 구현하는 방법


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'
        }
    };
});

그러나 아무 일도 일어나지 않습니다. angular.js API에서 $ location 에 대해 살펴 보았지만 뒤로 버튼 또는에 대해서는 아무것도 찾지 못했습니다 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 개의 버튼이 있습니다. 홈에 대한 버튼과 1 개의 버튼이 있습니다. 코드를 이해하면 링크 기능의 요소가 해당 경우에 클릭 한 요소입니다 history.back은 홈 버튼에도 적용됩니까? )
baba-dev

예제를 약간 변경했습니다. 이제 두 개의 버튼 (뒤로 및 앞으로)이 있습니다. 이제 jQuery를 사용하므로 scope. $ apply ()가 클릭에 필요합니다.
asgoth

8
이 코드는 테스트 할 수 없으므로 실제로는 '창'대신 '$ 창'객체를 사용해야합니다.
Arbiter

이것은 IE8에서 작동합니까? 나는 그것이 역사가 있다고 믿지 않는다
Neil

5
@Neil, Angular는 자랑스럽게 IE8을 지원하지 않습니다. 그래서 안돼.

133

각도 경로는 브라우저의 위치를보고 있으므로 단순히 window.history.back()클릭 하면 사용 하는 것이 좋습니다.

HTML :

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

JS :

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

일반적으로 앱 컨트롤러에서 '$ back'이라는 전역 함수를 작성합니다. 일반적으로 body 태그를 사용합니다.

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
"전역 기능"에 어떤 것도 넣지 말 것을 권합니다. 세계 국가에 일어날 수있는 많은 것들이 있습니다 . 이 경우에는 대부분 변동성이 있습니다. 지시어 또는 서비스에서 제 3 자 (또는 대규모 팀의 경우 다른 개발자)의 코드는 지시문이나 서비스가 쉽게 자녀의 $ scope. $ back을 수정할 수 있습니다. 디버깅하기 어려울 수 있습니다. 각 구성 요소에 서비스를 주입하고 필요한 경우 기능을 공개하는 것이 좋습니다. 예는 "앱에 대한 글로벌"이지만 위험이 있습니다
Ben Lesh

출처 : 나는 "전역"앱 $ scope에 붙어있는 것들이 너무 많아서 계산하기가 너무 어려워서 서비스를 위해 그 기술을 사용하지 않았습니다. 여전히 밟을 수는 있지만, 더 쉬운 방법입니다.

65

여분의 $ window에서 컨트롤러를 유지하기 위해 간단한 지시문을 사용하는 것이 이상적입니다.

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
닫는 중괄호를 재정렬하고 지시문과 요소 attr의 이름을 바꾸면 작동하는 것처럼 보입니다.
remarsh

18

유용 할 경우 ... "10 $ digest () 반복에 도달했습니다. 중단 중입니다." $ window.history.back ()을 사용할 때 오류; IE9 사용 (물론 다른 브라우저에서도 잘 작동 함).

나는 그것을 사용하여 작동하도록했다 :

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

다른 답변은 일반을 사용 window합니다. $windowAngular 서비스를 사용하고있는 것 같습니다 . 아마도 이것이 근본 원인일까요?
superjos

7
IE9에서 동일한 오류가 발생하여 문제가 해결되었습니다. github.com/angular/angular.js/issues/1417 참조 그는 $ window를 사용하는 것이 옳습니다.이 시점에서 다른 모든 답변은 "잘못된"입니다. docs.angularjs.org/api/ng.$window
tanguy_k

왜 100ms에 대한 아이디어가 있습니까? 그것은 꽤 지연입니다. 덜 작동합니까?
Kevin

@ 케빈 (Kevin) 100ms는 내가 합리적이라고 생각한 기간이었고 눈에 띄지 않았다. 실제로 작은 지연이 작동 할 수 있습니다.
Rob Bygrave

내 앱에서 Angular 기본 탐색을 사용할 때 최신 Chrome에서 비슷한 문제가 발생하지만 지연이 도움이되지 않습니다. 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();
}

기능을 수행 한 후 응용 프로그램이 angular2 / router에서 이전 페이지 usgin location으로 이동하고 있음을 알 수 있습니다.

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


작동하지만 @ angular / router가 아닌 @ angular / common에서 가져와야합니다.
plexus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.