【问题标题】:AngularJS - How to validate URL dynamic paramsAngularJS - 如何验证 URL 动态参数
【发布时间】:2015-12-13 18:32:18
【问题描述】:

部分路线是这样的

.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'。

【问题讨论】:

  • 在你的控制器中检查它并在出错时重定向到另一个路由
  • 这就像一个管理员后端?如果是这样,只需使用布尔值,true 表示管理员,false 表示不。这比遍历列表要好。如果是这样的话,只是一个建议。
  • @Phill,我试过了,但在重定向到主页之前,网址仍然显示错误的 id 参数半秒。谢谢
  • @Joe,它用于前端。谢谢

标签: angularjs routes url-parameters dynamic-url


【解决方案1】:

如果您已经有了 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,它可以很容易地进行各种迭代,我建议你只用一次,你会喜欢的

【讨论】:

  • 感谢 maddygoround!我让这部分工作,但是,在添加 $rootScope.$on('$routeChangeError', function(){}) 之后,我发现当 promise 被拒绝时,永远不会调用 $routeChangeError。我将在问题中添加这部分。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2017-10-05
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多