AngularJS - 如何验证URL动态参数

时间:2015-09-17 00:55:11

标签: angularjs routes url-parameters dynamic-url

部分路线就像这样

.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;
              });
            }
          }
        })

然而,当承诺被拒绝时,它不会启动$ 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();
          }
        });
  }]);

====更新=== 我搞定了。我之前犯的错误就是让defer.promise'在那个街区内。

1 个答案:

答案 0 :(得分:0)

如果你已经有了id列表,那就是你可以做的,

.when('/id/:id', {
            templateUrl: 'id.html',
            controller: myController,
            resolve: {

                validateid: ["$q", "$routeParams", function($q, $routeParams) {

                    var id = Enumerable.From(arrayofids)
                        .Where(function(x) {
                            return x.id == $routeParams.id
                        });

                    if (id) {
                        return $q.when($routeParams.id);
                    } else {
                        return $q.reject({
                            authenticated: false
                        });
                    }

                }],

            }
        }

resolve是一个可以在导航发生之前执行所有操作的地方,

我曾经使用linq.js很容易进行各种迭代,我建议你只使用它一次,你会喜欢它