私はAngularJSを学んでいます。/ビュー1使用してマイ1Ctrl、 そして/ビュー2使用してマイ2Ctrl; タブを使用して移動でき、各ビューには独自のシンプルだが異なるフォームがあります。
入力された値がビュー1ユーザーが退出してから戻った場合、リセットされません。ビュー1?
私が言いたいのは、2回目の訪問がビュー1モデルをそのままの状態に保ちますか?
ベストアンサー1
私は、これを最も効果的に行う方法を見つけるのに少し時間がかかりました。また、ユーザーがページを離れて戻るボタンを押したときに、元のページに戻るための状態を保持したいと考えていました。すべてのデータをルートスコープ。
最終的な結果は、サービスそれぞれコントローラコントローラーには、クリアされていれば気にする必要のない関数と変数だけがあります。
コントローラーのサービスは依存性注入によって注入されます。サービスはシングルトンなので、コントローラーのデータのようにそのデータは破棄されません。
サービスにはモデルがあります。モデルにはデータのみがあり、関数はありません。こうすることで、JSON との間で変換して永続化することができます。永続化には html5 ローカルストレージを使用しました。
最後に、 と を使用してwindow.onbeforeunload
、$rootScope.$broadcast('saveState');
すべてのサービスに状態を保存する必要があることを通知し、$rootScope.$broadcast('restoreState')
状態を復元するように通知しました (それぞれ、ユーザーがページを離れる場合と、戻るボタンを押してページに戻る場合に使用)。
例として挙げられるサービスユーザーサービス私のユーザーコントローラー:
app.factory('userService', ['$rootScope', function ($rootScope) {
var service = {
model: {
name: '',
email: ''
},
SaveState: function () {
sessionStorage.userService = angular.toJson(service.model);
},
RestoreState: function () {
service.model = angular.fromJson(sessionStorage.userService);
}
}
$rootScope.$on("savestate", service.SaveState);
$rootScope.$on("restorestate", service.RestoreState);
return service;
}]);
ユーザーコントローラー例
function userCtrl($scope, userService) {
$scope.user = userService;
}
ビューは次のようにバインディングを使用します
<h1>{{user.model.name}}</h1>
そして、アプリモジュール実行関数内では、放送のセーブステートそして状態を復元する
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (sessionStorage.restorestate == "true") {
$rootScope.$broadcast('restorestate'); //let everything know we need to restore state
sessionStorage.restorestate = false;
}
});
//let everthing know that we need to save state now.
window.onbeforeunload = function (event) {
$rootScope.$broadcast('savestate');
};
前述したように、この段階に到達するまでに時間がかかりました。これは非常にクリーンな方法ですが、Angular で開発する際に非常に一般的な問題と思われることを実行するには、かなりのエンジニアリングが必要です。
ユーザーがページを離れて戻ってきたときなど、コントローラー間で状態を保持する処理をより簡単に、かつクリーンな方法で実現できればと思います。