Ionicを使用したモバイルアプリケーション開発は初めてです。ログインおよびログアウト時に、データを更新するためにページをリロードする必要がありますが、$state.go('mainPage')
はリロードせずにユーザーをビューに戻します-その背後のコントローラーは呼び出されません。
Ionicで履歴をクリアして状態をリロードする方法はありますか?
JimTheDevの答えは、状態定義にcache:false
が設定されている場合にのみ機能することがわかりました。ビューをキャッシュして、ある状態からキャッシュされているが更新が必要な状態に移動する場合は、$ionicHistory.clearCache()
を実行してから、$state.go('app.fooDestinationView')
を実行できます。
Ionicを簡単に変更する必要があるため、私の回答を参照してください。プルリクエストを作成しました。 https://stackoverflow.com/a/30224972/756177
正しい答え:
$window.location.reload(true);
私はそれを成し遂げるのに役立つ解決策を見つけました。 cache-view="false"
タグにion-view
を設定すると、問題が解決しました。
<ion-view cache-view="false" view-title="My Title!">
....
</ion-view>
ページをリロードするのは最善の方法ではありません。
ビュー自体をリロードすることなく、データをリロードするための状態変更イベントを処理できます。
ここでionicViewライフサイクルについて読む
http://blog.ionic.io/navigating-the-changes/
データをリロードするためにbeforeEnterイベントを処理します。
$scope.$on('$ionicView.beforeEnter', function(){
// Any thing you can think of
});
私の場合、ビューだけをクリアしてコントローラーを再起動する必要があります。私はこのスニペットで私の意図を得ることができました:
$ionicHistory.clearCache([$state.current.name]).then(function() {
$state.reload();
}
キャッシュはまだ機能しており、ビューだけがクリアされているようです。
ionic --version
は1.7.5と言います。
上記のソリューションはいずれも、localhost
と異なるホスト名に対しては機能しませんでした!
notify: false
呼び出しの前に、Angular変更リスナーの呼び出しを避けるために、$state.go
に渡すオプションのリストに$window.location.reload
を追加する必要がありました呼び出されます。最終的なコードは次のようになります。
$state.go('home', {}, {reload: true, notify: false});
>>> EDIT-ブラウザによっては$ timeoutが必要になる場合があります>>>
$timeout(function () { $window.location.reload(true); }, 100);
<<<編集終了<<<
これについての詳細は i-router reference をご覧ください。
.state(url: '/ url'、controller:Ctl、templateUrl: 'template.html'、cache:false)cache:false ==>問題を解決しました!
スクロールバーを機能させるには、状態をリロードする必要がありました。 「登録」という別の州を通過するとき、彼らは働きませんでした。登録後にアプリが強制的に閉じられ、再び開かれた場合、つまり、直接「ホーム」状態になった場合、スクロールバーは機能しました。上記のソリューションはどれも機能しませんでした。
登録後、私は置き換えました:
$state.go("home");
と
window.location = "index.html";
アプリがリロードされ、スクロールバーが機能しました。
コントローラーは1回だけ呼び出され、この論理モデルを保存する必要があります(通常は次のようにします)。
メソッド$scope.reload(params)
を作成します
このメソッドの最初に$ionicLoading.show({template:..})
を呼び出して、カスタムスピナーを表示します
再読み込みプロセスが完了すると、$ionicLoading.hide()
をコールバックとして呼び出すことができます
最後に、更新ボタンの中に、ng-click = "reload(params)"
を追加します
このソリューションの唯一の欠点は、ionicナビゲーション履歴システムが失われることです
お役に立てれば!
@ezainが指摘したように、必要な場合にのみコントローラーをリロードします。コントローラーをリロードするのではなく、状態を変更するときにデータを更新するもう1つのクリーンな方法は、ブロードキャストイベントを使用し、ビュー上のデータを更新する必要があるコントローラーでそのようなイベントをリッスンすることです。
例:ログイン/ログアウト機能では、次のようなことができます:
$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 = '';
});
私は混乱しているウェブサイトを見たときにangularjsを使用してページを更新しようとしましたが、コードに対してコードが機能していなかったため、
$state.go('path',null,{reload:true});
これが機能する関数でこれを使用します。
ビューを変更した後にリロードする場合は、
$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);