除非已设置变量,否则使用routeprovider限制对路径的访问

时间:2014-11-06 22:09:57

标签: angularjs angular-ui-router

我正在学习AngularJS,正在开发更深入的ToDo应用程序。我在尝试使用angular限制访问网址或“路由”时遇到问题。

当你在我的机器上点击我的开发网址(todo.ang)时,它会将你带到todo.ang /#/ home,在这个视图中你会看到与每个关联的待办事项类别。 EG(类别= cat,cat有“feed”和“play”的todo),当你点击一个类别我正在调用$ scope.goToCategory函数(在我的JS小提琴中看到)为我的firebase设置一个变量ref然后重定向你/#/ todo。这工作正常。

我的问题是,如果todoRef变量仍未定义,我不希望用户能够访问/#/ todo。但似乎甚至在调用$ scope.goToCategory并将todoRef设置为firebase URL之后,路由器提供者永远不会被召回以知道todoRef已设置为不同的值,因此它总是强制您返回/#/ home。 / p>

代码:

var todoRef = undefined; 

if (todoRef !== undefined) {
   $routeProvider.when('/todo', {
   templateUrl: 'views/todo.html',
   controller: 'TodoCtrl'
   });
}

$scope.goToCategory = function(catId) {
   test = catId;
   todoRef = new Firebase("URL HERE");
   $location.path('/todo');
}

我没有包含整个代码文件,但如果有必要,我也可以这样做。

JSFiddle

1 个答案:

答案 0 :(得分:1)

仅在配置阶段设置所有路由。 您的代码中发生的事情是' todo'在启动ngRoute期间忽略路线。

你应该做的是设置路线但是有这样的决心:

app.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/todo', {
    templateUrl: 'views/todo.html',
    controller: 'TodoCtrl',
    resolve: {
      todoRef: ['$q', function($q) {
        return todoRef ? todoRef : $q.reject('no ref');
      }]
    }
  });
}]);

如果' todoRef'未定义路线被拒绝。

另外你应该考虑移动&tutoRef'进入服务而非全球范围。


您还可以侦听路线错误,例如重定向到主路线:

app.run(['$rootScope', '$location', function($rootScope, $location) {
  $rootScope.$on('$routeChangeError', function() {
    $location.path('/home');
  });
}]);