1

ルートの一部はこんな感じ

.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」を入れたことです。

4

1 に答える 1