Javascript MEANJS:检查数据库中的url并路由到动态角度状态
上下文 用户可以使用标识其页面的唯一URL slug进行注册,例如“.” 当前状态 在我的Express.js文件中,我成功地检查了我的数据库,以查看用户上是否存在slug,然后将用户从''重定向到'',以利用Angular的路由 然而,对于Angular,我不能在我的路由器文件中使用$http或$location服务(因为它发生在module.config中…有关更多详细信息,请参阅) 欲望 基本上,我想做的是,当找到有效的slug时,将用户路由到“默认”视图,如果找不到,则路由到主视图。如有任何建议,将不胜感激 作为参考,我的module.config代码可以在这里找到(请注意,我要使用的“默认”状态是“搜索”): core.client.routes.jsJavascript MEANJS:检查数据库中的url并路由到动态角度状态,javascript,angularjs,meanjs,Javascript,Angularjs,Meanjs,上下文 用户可以使用标识其页面的唯一URL slug进行注册,例如“.” 当前状态 在我的Express.js文件中,我成功地检查了我的数据库,以查看用户上是否存在slug,然后将用户从''重定向到'',以利用Angular的路由 然而,对于Angular,我不能在我的路由器文件中使用$http或$location服务(因为它发生在module.config中…有关更多详细信息,请参阅) 欲望 基本上,我想做的是,当找到有效的slug时,将用户路由到“默认”视图,如果找不到,则路由到主视图。如有
'use strict';
// Setting up route
angular.module('core').config(['$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
// Redirect to home when route not found.
$urlRouterProvider.otherwise('/');
// Home state routing
$stateProvider.
state('home', {
url: '/',
templateUrl: 'modules/core/views/home.client.view.html'
}).
state('search', {
url: '/search',
templateUrl: 'modules/core/views/search.client.view.html'
});
}
]);
我想做的,是这样的
'use strict';
// Setting up route
angular.module('core').config(['$stateProvider', '$urlRouterProvider', '$http', '$location',
function($stateProvider, $urlRouterProvider, $http, $location) {
// Get current slug, assign to json.
var slug = $location.path();
var data = {
link: slug
};
// Check db for slug
$http.post('/my/post/route', data).success( function(response) {
// Found slug in db
}).error( function(response) {
// Route to home
$location.path('/');
});
// Home state routing
$stateProvider.
state('home', {
url: '/',
templateUrl: 'modules/core/views/home.client.view.html'
}).
state('search', {
// Set URL to slug
url: '/' + slug,
templateUrl: 'modules/core/views/search.client.view.html'
});
}
]);
要直接回答您的问题,您要做的是使用路由“resolve”检查依赖项并重定向到适当的视图:
angular.module('app',['ui.router','ngMockE2E']))
.run(函数($httpBackend){
$httpBackend.whenGET(/api\/slugs\/.*/).respond(函数(方法,url){
返回url.match(/good$/)?[200,{name:'johndoe'}]:[404',];
});
})
.config(函数($stateProvider){
$stateProvider
.州(
“搜索”,
{
url:“/search?terms=:slug”,
模板:“搜索:{{vm.terms}}”,
controllerAs:'vm',
控制器:函数($stateparms){
this.terms=$stateParams.slug;
}
}
)
.州(
“鼻涕虫”,
{
url:“/:slug”,
模板:“Slug:{{vm.user.name}}”,
controllerAs:'vm',
控制器:功能(用户){
this.user=user
},
决心:{
用户:函数($q、$http、$stateParams、$state){
var defer=$q.defer();
$http.get('http://somewhere.com/api/slugs/'+$stateParams.slug)
.成功(功能(用户){
延迟解析(用户);
})
.错误(函数(){
defer.reject();
$state.go('search',{slug:$stateParams.slug});
});
回报、承诺;
}
}
}
);
});代码>
匹配路线
重定向路由
谢谢您的回复,杰夫。你的建议帮助我对我正在做的一些有问题的事情进行了概念化(我对AngularJS是新手,这是不是很明显?)。我已经大大简化了事情,只是将$http请求完全放在我的控制器中。我还更改了用户从'example.com/#路由到的url/slug“to”example.com/#/搜索/slug'(因为它覆盖了我的所有其他页面,比如/#!/sign等)。再次感谢您的帮助。这也是一个很好的选择: