代码之家  ›  专栏  ›  技术社区  ›  user2800489

AngularJS-如何验证URL动态参数

  •  1
  • user2800489  · 技术社区  · 9 年前

    部分路线是这样的

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

    ====更新=== 我成功了。我早些时候犯的错误是推迟返回。“承诺”在随后的街区内。

    1 回复  |  直到 9 年前
        1
  •  0
  •   maddygoround    9 年前

    如果你已经有了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,这使得所有类型的迭代都非常容易,我建议你只使用一次,你会喜欢它的