ルートの一部はこんな感じ
.when('/id/:id',
{
templateUrl: 'id.html',
controller: myController,
})
':id' が、サービス機能呼び出しからの一連の ID からのものかどうかを検証したいと思います。そうでない場合は、ページのレンダリングを防止する必要があります。
ルートに解決を追加することで、この部分が機能するようになりました。コードはこんな感じ
.when('/id/:id',
{
templateUrl: 'id.html',
controller: myController,
resolve: {
validate: function($q, $route, myService) {
myService.getProjects().then(function(data) {
var defer = $q.defer(),
project = $route.current.params.project;
if (myContains(data.projects, project)) {
defer.resolve();
} else {
defer.reject({authenticated: false});
}
return defer.promise;
});
}
}
})
ただし、promise が拒否された場合、$routeChangeError は発生しません。これを次のように記述しました。
myApp.app.module.config(['$routeProvider', myApp.app.config])
.run(
['$rootScope', '$location', function($rootScope, $location) {
$rootScope.$on('$routeChangeError',
function(event, current, previous, rejection) {
var rejection = {};
if (!rejection.authenticated) {
$location.path('/').replace();
}
});
}]);
====更新=== 動作しました。前に犯した間違いは、then ブロック内に「return defer.promise」を入れたことです。