[解決済み】Angular ui-routerで$stateメソッドを$stateChangeStart toStateとfromStateで使用する。
質問
のハンドラを書いています。
$stateChangeStart
:
var stateChangeStartHandler = function(e, toState, toParams, fromState, fromParams) {
if (toState.includes('internal') && !$cookies.MySession) {
e.preventDefault();
// Some login stuff.
}
};
$rootScope.$on('$stateChangeStart', stateChangeStartHandler);
toState
はincludesメソッドを持っていません。何か違うことをしなければならないのでしょうか、それとも私がやろうとしていることを実行する方法があるのでしょうか?
また、//あるログインネタに
$state.go(...)
無限ループになります。何が原因でしょうか?
以下は、最終的に動作するようになったものを示す、より完全な例です。
angular.module('test', ['ui.router', 'ngCookies'])
.config(['$stateProvider', '$cookiesProvider', function($stateProvider, $cookiesProvider) {
$stateProvider
.state('public', {
abstract: true
})
.state('public.login', {
url: '/login'
})
.state('tool', {
abstract: true
})
.state('tool.suggestions', {
url: '/suggestions'
});
}])
.run(['$state', '$cookies', '$rootScope', function($state, $cookies, $rootScope) {
$rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if (toState.name.indexOf('tool') > -1 && !$cookies.Session) {
// If logged out and transitioning to a logged in page:
e.preventDefault();
$state.go('public.login');
} else if (toState.name.indexOf('public') > -1 && $cookies.Session) {
// If logged in and transitioning to a logged out page:
e.preventDefault();
$state.go('tool.suggestions');
};
});
});
を使うのは好きではありません。
indexOf
で特定の状態を検索します。
toState
. 素朴な感じがします。私は、なぜ
toState
と
fromState
のインスタンスになり得なかった。
$state
サービス、あるいはなぜ
$state
サービスは、そのメソッドで状態設定のオーバーライドを受け入れることができませんでした。
無限ループは、こちらのミスで発生しました。私はこれが好きではないので、まだ良い答えを探しているところです。
解決方法は?
提案1
にオブジェクトを追加すると
$stateProvider.state
そのオブジェクトは、ステートと一緒に渡されます。そのため、必要なときに後で読むことができる追加のプロパティを追加することができます。
ルート設定例
$stateProvider
.state('public', {
abstract: true,
module: 'public'
})
.state('public.login', {
url: '/login',
module: 'public'
})
.state('tool', {
abstract: true,
module: 'private'
})
.state('tool.suggestions', {
url: '/suggestions',
module: 'private'
});
は
$stateChangeStart
イベントにアクセスすることができます。
toState
と
fromState
オブジェクトを作成します。これらの状態オブジェクトには、設定プロパティが含まれることになります。
カスタムモジュールプロパティのチェック例
$rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if (toState.module === 'private' && !$cookies.Session) {
// If logged out and transitioning to a logged in page:
e.preventDefault();
$state.go('public.login');
} else if (toState.module === 'public' && $cookies.Session) {
// If logged in and transitioning to a logged out page:
e.preventDefault();
$state.go('tool.suggestions');
};
});
クッキーのロジックは、ご質問の範囲外だと思いますので、変更しませんでした。
提案2
よりモジュール的に動作させるためのHelperを作成することができます。
値
publicStates
myApp.value('publicStates', function(){
return {
module: 'public',
routes: [{
name: 'login',
config: {
url: '/login'
}
}]
};
});
値
privateStates
myApp.value('privateStates', function(){
return {
module: 'private',
routes: [{
name: 'suggestions',
config: {
url: '/suggestions'
}
}]
};
});
ヘルパー
myApp.provider('stateshelperConfig', function () {
this.config = {
// These are the properties we need to set
// $stateProvider: undefined
process: function (stateConfigs){
var module = stateConfigs.module;
$stateProvider = this.$stateProvider;
$stateProvider.state(module, {
abstract: true,
module: module
});
angular.forEach(stateConfigs, function (route){
route.config.module = module;
$stateProvider.state(module + route.name, route.config);
});
}
};
this.$get = function () {
return {
config: this.config
};
};
});
これで、ヘルパーを使用して状態設定を追加できるようになりました。
myApp.config(['$stateProvider', '$urlRouterProvider',
'stateshelperConfigProvider', 'publicStates', 'privateStates',
function ($stateProvider, $urlRouterProvider, helper, publicStates, privateStates) {
helper.config.$stateProvider = $stateProvider;
helper.process(publicStates);
helper.process(privateStates);
}]);
こうすることで、繰り返されるコードを抽象化し、よりモジュール化された解決策を導き出すことができるのです。
注:上記のコードはテストされていません
関連
-
[解決済み】TypeError: window.initMap is not a function
-
[解決済み】angularのonLoadとng-initの違いについて
-
[解決済み] ページロード時にAngularJSのコントローラ関数を実行する方法は?
-
[解決済み] ReferenceError: Angularは定義されていません。
-
[解決済み] ajaxリクエスト時にAngularjsのローディング画面が表示される。
-
[解決済み] angular-routeとangular-ui-routerの違いは何ですか?
-
[解決済み] ServiceとFactoryで迷う
-
[解決済み] ui-routerでui-srefを使用してパラメータをコントローラに渡す方法
-
[解決済み] AngularJSでEnterキーを押したときにフォームを送信する
-
[解決済み] Angular - ui-router 前の状態を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: window.initMap is not a function
-
[解決済み】Angularjs accordion ng-click on panel-header
-
[解決済み] angularJSのSTATEを理解する
-
[解決済み] data-ng-file-selectが動作しないのはなぜですか?
-
[解決済み] Angular 1.2+ で ng-bind-html-unsafe を複製するために $sce.trustAsHtml(string) を使用するにはどうしたらよいですか?
-
[解決済み] AngularJSの$parentは何を意味するのですか?
-
[解決済み] AngularJS の ng-disabled ディレクティブに式を指定しても動作しない
-
[解決済み] angularjsでチャートを作成する【終了】。
-
処理されない例外が発生しました。Angular 実行中のプロジェクトで NGCC に失敗しました。
-
[解決済み] AngularJS: ngRouteが動作しない。