2014-11-06 38 views
0

我正在学习AngularJS,正在研究更深入的ToDo应用程序。我遇到了一个问题,试图限制使用角度访问URL或“路线”。限制对routeprovider的路由访问,除非已设置变量

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

我的问题是,如果todoRef变量仍未定义,我不希望用户能够访问/#/ todo。但是,即使在调用了$ scope.goToCategory并将todoRef设置为firebase URL之后,似乎也不会调用routerprovider,以知道todoRef已设置为不同的值,因此它总是强制您返回到/#/ home。

代码:

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

+0

您需要可以重现该问题在小提琴或交的全部代码。你的小提琴现在是无用的。 – 2014-11-06 22:12:33

+0

我的applogies,继承人一个现场示例 http://charliebois.com/angular/ 并更新了我的app.js的提琴在哪里发生的一切。 http://jsfiddle.net/89q4vL6p/1/ – Kcharle 2014-11-06 22:46:51

回答

1

所有路由都被只在配置阶段设置。 您的代码中发生的情况是,在启动ngRoute期间忽略'todo'路由。

你应该做的是建立了航线,但有像这样一个决心:

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”是未定义的路由被拒绝。

另外,您应该考虑将'todoRef'移动到服务中,而不是全局范围内。


您也可以监听路线错误,例如重定向到家里路线:

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

感谢您的回应!当我把你的代码放在路由提供程序中时,它给了这个控制台错误,当我尝试访问URL /#/ todo时没有点击类别(ReferenceError:$ q未定义;)我的实例已更新以显示此内容。 http://charliebois.com/angular/ – Kcharle 2014-11-06 22:58:17

+0

是否有可能让它回到/ home,而不是只停留在该网址,如果它的未定义?你的建议确实有效,但它只是在/ todo页 – Kcharle 2014-11-06 23:03:04

+0

@Kcharle检查我的更新 – 2014-11-06 23:11:03