Ionic Framework를 사용하여 로그인 / 로그 아웃시 기록 지우기 및 페이지 다시로드


80

Ionic을 사용한 모바일 애플리케이션 개발이 처음입니다. 로그인 및 로그 아웃시 데이터를 새로 고치려면 페이지를 다시로드해야하지만, $state.go('mainPage')다시로드하지 않고 사용자를 다시보기로 안내합니다. 그 뒤에있는 컨트롤러는 호출되지 않습니다.

Ionic에서 기록을 지우고 상태를 다시로드 할 수있는 방법이 있습니까?

답변:


124

프레임 워크에 오신 것을 환영합니다! 실제로 Ionic의 라우팅은 ui-router에 의해 구동됩니다 . 작업을 수행하는 몇 가지 다른 방법을 찾으려면 이 이전 SO 질문 을 확인해야 합니다.

상태를 다시로드하려면 다음을 사용할 수 있습니다.

$state.go($state.current, {}, {reload: true});

실제로 페이지를 다시로드하려면 (예 : 모든 것을 다시 부트 스트랩하려는 경우) 다음을 사용할 수 있습니다.

$window.location.reload(true)

행운을 빕니다!


원격 서버에서 가져온 모든 css / js 파일을 index.html에 묶고 싶습니다. 하지만 변경 사항이있는 경우에만 다시로드하는 것이 좋습니다. 어떻게 구성해야합니까?
mylord

@mylord를 이해하는지 잘 모르겠습니다. 라이브 리로드에 대해 이야기하고 있습니까? 여기에 설명 된대로 Html5 오프라인 캐시 / 매니페스트에 관심 이있을 수 있습니다 . tmkmobile.wordpress.com/2012/03/04/html5-offline-solution 질문의 원래 의도와 다른 작업을 시도하고있을 수 있습니다.
JimTheDev

13
$ state.go ($ state.current, {}, {reload : true}); 이 솔루션은 나를 위해 작동하지 않습니다.
IamStalker

@IamStalker 추가 정보를 제공하거나 코드 펜 / 바이올린 / 플렁크를 예로들 수 있습니까?
JimTheDev

9
$state.go($state.current, {}, {reload: true});cache:true상태 정의에서 (캐시가 생략 된 경우 기본값) 작동하지 않습니다 . #ionic 1.0.0-RC2 및 1.0.0에서 테스트되었습니다. 내 대답을 참조하십시오.
ABCD.ca 2015 년

25

JimTheDev의 대답은 상태 정의가 cache:false설정 되었을 때만 작동한다는 것을 알았습니다 . 보기 캐시, 당신은 할 수있는 $ionicHistory.clearCache()다음 $state.go('app.fooDestinationView')당신은 캐시되지만 새로 고쳐야 하나 하나의 상태에서 이동하는 경우.

Ionic에 대한 간단한 변경이 필요하고 풀 요청을 만들었으므로 여기에서 내 대답을 참조하십시오. https://stackoverflow.com/a/30224972/756177


1
좋은 물건. 나는 실제로 이것을 내 이온 앱에서 사용하지 않으므로 캐싱 기능에 대한 후속 조치에 감사드립니다. 귀하의 PR이 1.0.1에 들어갈 것 같습니다. 그것이 공개되면 나는 나의 원래 포스트에 당신을 크레딧하고 사람들이 살펴 보도록 촉구하는 메모를 할 것입니다.
JimTheDev

18

정답 :

$window.location.reload(true);

1
이 답변은 품질이 낮은 것으로 표시되었습니다. 왜 정답인지 설명해 주시겠습니까?
Jorge Leitao

1
$window대신 사용하기 때문에window
EpokK

.location.reload 구문을 사용하면 $ window를 사용하는 것이 합리적이라는 점에서 정확합니다. 나는 미래의 독자를 위해 일관되게 위의 대답을 변경했습니다. $ state.go 구문은 특정 경우에도 유용 할 수 있습니다.
JimTheDev 2014-08-19

오직이 답변하지 쳤다 하나, 도움이되었습니다
마이클

나는 그 접근 방식을 좋아했지만 일부 사람들은 일부 장치 (Android 4.4, Chrome)에서 무한 루프를 다시로드한다고보고했습니다.
Oleg Cheremisin 2016

18

나는 그것을 완료하는 데 도움이되는 해결책을 찾았습니다. 태그 설정 cache-view="false"으로 ion-view문제가 해결되었습니다.

<ion-view cache-view="false" view-title="My Title!">
  ....
</ion-view>

캐시보기를 비활성화하면 성능이 크게 저하되므로이 옵션을 피해야합니다. 대신 ionicView 이벤트를 처리 할 수 ​​있습니다. 참조 : stackoverflow.com/questions/25192172/…
ezain

@ezain, 성능이 어떻게 영향을 받는지 알려주시겠습니까?
Rajeshwar nov.

@Rajeshwar, 캐시 시스템이 활성화되면 Ionic은 숨겨진 뷰에 의해 생성 된 모든 DOM을 유지하고 뷰 변경이 발생할 때 DOM을 다시 계산할 필요가 없습니다. 무거운 DOM이 있고 모든 전환 변경에서 생성해야하는 경우 전환 애니메이션의 지연을 인식 할 수 있습니다. 캐시를 비활성화하는 이유 만 컨트롤러를 다시로드하는 경우 ionicView 이벤트를 사용하십시오.
ezain 15.11.

@ezain, 캐시 비활성화 기능을 구현하는 방법에는 여러 가지가 있습니다. 나는 거의 모든 것을 시도했지만 아무것도 효과가 없었습니다. 그리고 이것은 나에게 필요한 것을주었습니다. 페이지가 조금 크더라도 해당 페이지를로드하는 동안 상당한 지연이 발생하지 않습니다. 그래서 다른 방법보다이 방법을 선호했습니다.
Rajeshwar

11

페이지 새로 고침은 최선의 방법이 아닙니다.

뷰 자체를 다시로드하지 않고도 데이터를 다시로드하기위한 상태 변경 이벤트를 처리 할 수 ​​있습니다.

여기에서 ionicView 수명주기 에 대해 읽어보십시오 .

http://blog.ionic.io/navigating-the-changes/

데이터 다시로드를 위해 beforeEnter 이벤트를 처리합니다.

$scope.$on('$ionicView.beforeEnter', function(){
  // Any thing you can think of
});

이것이 최선의 방법 인 것 같습니다.
markau

특히 상태가 캐시에서 온 것인지 확인할 수 있으며, 그렇다면 일부 API를 호출하여 새로 고칠 수 있습니다.$scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
jakub.g

@ jakub.g 뷰를 캐시하지 않으려면이 특정 뷰에 대해 캐시를 비활성화 할 수 있습니다. 더 간단합니다.
ezain

6

제 경우에는보기 만 지우고 컨트롤러를 다시 시작해야합니다. 이 스 니펫으로 내 의도를 얻을 수 있습니다.

$ionicHistory.clearCache([$state.current.name]).then(function() {
  $state.reload();
}

캐시는 여전히 작동하며보기 만 지워진 것 같습니다.

ionic --version 1.7.5를 말합니다.


부록 : 상태에 매개 변수가있는 경우보기 / 상태 식별에서 매개 변수를 정의해야합니다. 이 페이스트 빈을 확인하십시오 pastebin.com/2CaGYpnz이
glaucomorais

코드 오류 올바른 버전 $ ionicHistory.clearCache ([$ state.current.name]). then (function () {$ state.reload ();});
Kirill A

그냥 괄호가 누락
user623396

1

위에서 언급 한 솔루션 중 어느 것도 localhost! 와 다른 호스트 이름에 대해 작동하지 않았습니다 .

호출이 호출 되기 전에 Angular 변경 리스너를 호출하지 않도록 notify: false전달하는 옵션 목록에 추가 해야했습니다 . 최종 코드는 다음과 같습니다.$state.go$window.location.reload

$state.go('home', {}, {reload: true, notify: false});

>>> 편집-브라우저에 따라 $ timeout이 필요할 수 있습니다. >>>

$timeout(function () { $window.location.reload(true); }, 100);

<<< 편집 종료 <<<

이에 대한 자세한 내용은 ui-router 참조 .


0

웹 사이트를 보았을 때 angularjs를 사용하여 페이지 새로 고침을 시도했지만 혼란 스러웠지만 코드에서 코드가 작동하지 않았으며 페이지를 다시로드하는 솔루션을 얻었습니다.

$state.go('path',null,{reload:true});

이것이 작동하는 함수에서 이것을 사용하십시오.


0

스크롤바가 작동하도록 상태를 다시로드해야했습니다. 그들은 다른 주 ( '등록')를 통해 올 때 작동하지 않았습니다. 앱이 등록 후 강제 종료되었다가 다시 열리면, 즉 '홈'상태로 바로 이동 한 경우 스크롤바가 작동합니다. 위의 솔루션 중 어느 것도 작동하지 않았습니다.

등록 후 다음을 교체했습니다.

$state.go("home");

window.location = "index.html"; 

앱이 다시로드되고 스크롤바가 작동했습니다.


0

컨트롤러는 한 번만 호출되며이 논리 모델을 유지해야합니다. 일반적으로 수행하는 작업은 다음과 같습니다.

나는 방법을 만든다 $scope.reload(params)

이 메서드의 시작 부분에서 $ionicLoading.show({template:..})사용자 지정 스피너를 표시하기 위해 호출 합니다.

may reload 프로세스가 완료되면 $ionicLoading.hide()콜백으로 호출 할 수 있습니다.

마지막으로 REFRESH 버튼 안에 ng-click = "reload(params)"

이 솔루션의 유일한 단점은 이온 항법 기록 시스템을 잃어버린다는 것입니다.

도움이 되었기를 바랍니다!


0

보기 변경 후 다시로드하려면 다음을 수행해야합니다.

$state.reload('state',{reload:true});

그 뷰를 새로운 "루트"로 만들고 싶다면 다음 뷰가 루트가 될 것이라고 ionic에게 말할 수 있습니다.

 $ionicHistory.nextViewOptions({ historyRoot: true });
 $state.go('app.xxx');
 return;

뷰가 변경 될 때마다 컨트롤러를 다시로드하려면

app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

$ionicConfigProvider.views.maxCache(0);

0

.state (url : '/ url', controller : Ctl, templateUrl : 'template.html', cache : false) cache : false ==> 내 문제를 해결했습니다!


0

@ezain이 지적했듯이 필요할 때만 컨트롤러를 다시로드합니다. 컨트롤러를 다시로드하는 대신 상태를 변경할 때 데이터를 업데이트하는 또 다른 깨끗한 방법은 브로드 캐스트 이벤트를 사용하고 뷰에서 데이터를 업데이트해야하는 컨트롤러에서 이러한 이벤트를 수신하는 것입니다.

예 : 로그인 / 로그 아웃 기능에서 다음과 같이 할 수 있습니다.

$scope.login = function(){
    //After login logic then send a broadcast
    $rootScope.$broadcast("user-logged-in");
    $state.go("mainPage");
};
$scope.logout = function(){
   //After logout logic then send a broadcast
   $rootScope.$broadcast("user-logged-out");
   $state.go("mainPage");
};

이제 mainPage 컨트롤러에서 $ on 함수를 사용하여 다음과 같이 mainPage 컨트롤러 내에서 브로드 캐스트를 수신하여 뷰의 변경 사항을 트리거합니다.

$scope.$on("user-logged-in", function(){
     //update mainPage view data here eg. $scope.username = 'John';
});

$scope.$on("user-logged-out", function(){
    //update mainPage view data here eg. $scope.username = '';
});

-1

많은 방법을 시도했지만이 방법이 절대적으로 정확하다는 것을 알았습니다.

$window.location.reload();

버전 : angular 1.5.5, ionic 1.2.4, angular-ui-router 1.0.0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.