我正在创建一个CMS系统,所以我希望动态创建状态。由于您无法在配置阶段发出http请求,因此我决定在.run()函数中添加我的路由,如下所述:http://blog.brunoscopelliti.com/how-to-defer-route-definition-in-an-angularjs-web-app
现在,当我使用ui-sref指令在导航部分中显示链接列表时,附加的url有2个正斜杠而不是1。控制器和一切都被相应调用,但我似乎无法摆脱双斜线。有什么想法吗?
以下是相关代码:
app.js
var $stateProviderReference;
angular.module('app', [
'ui.router', // Angular UI Routing
'ngStorage', // Angular Storage (local, cookies, session)
'ngAnimate', // Angular Animation
'angular-loading-bar', // Angular Loading Bar
'restangular', // Restangular
'angular.assets.injector', // Custom assets injector
])
.config(function($stateProvider, $urlRouterProvider, RestangularProvider, $httpProvider, cfpLoadingBarProvider){
// Save a reference of our stateProvider
$stateProviderReference = $stateProvider;
// Irrelevant configuration
// States (routes)
$stateProvider
/*
|
| Frontend
|
*/
.state('frontend', {
url: '/',
views: {
'': {
templateUrl: 'app/views/frontend/templates/default/bootstrap.html',
controller: 'FrontendCtrl'
},
'nav@frontend': {
templateUrl: 'app/views/frontend/templates/default/partials/navigation.html',
controller: 'NavCtrl',
resolve: {
pages: function(PageService){
return PageService.all();
}
}
},
'footer@frontend': {
templateUrl: 'app/views/frontend/templates/default/partials/footer.html',
controller: 'FooterCtrl'
},
'page@frontend': {
templateUrl: 'app/views/frontend/pages/page.html',
controller: 'PageCtrl'
}
}
});
.run(function($rootScope, $location, $state, $stateParams, AuthService, CSRF_TOKEN, PageService){
// Retrieve all the pages
PageService.all().then(function(pages){
// Loop through all the pages
angular.forEach(pages, function(page){
// If this is not the homepage
if( page.routeName !== 'frontend' )
{
// Add a state to our stateProvider
$stateProviderReference.state(page.routeName, {
// Set the desired url
url: page.url,
// Views that we are populating
views: {
// Override the page view partial
'page@frontend': {
templateUrl: 'app/views/frontend/pages/page.html',
controller: 'PageCtrl'
}
}
});
}
});
});
navigation.html部分
<ul class="nav navbar-nav">
<li ng-repeat="page in pages">
<a ng-class="{'active': isActive({{page.routeName}})}" ui-sref="{{ page.routeName }}">{{ page.title }}</a>
</li>
</ul>
从数据库中检索的页面数据的格式如下:
{
id: 1,
routeName 'frontend.home',
title: 'Homepage',
url: '/home',
metaData: {
tags: "some random tags",
desc: "some random description"
},
content: "Html goes here",
deletable: 'yes' // or 'no'
}
所以除了双斜线外,一切似乎都有效。当我点击为上面的示例代码生成的链接时,它会将我发送到以下网址:
http://localhost/CMSv2/public/#//home
而不是
http://localhost/CMSv2/public/#/home
我尝试从routeName属性中删除正斜杠,然后它不会附加双斜杠,但是无法再访问控制器,所有内容似乎都会中断。
答案 0 :(得分:5)
问题来自这样一个事实:如果有父母 - 孩子的状态,他们的网址是parent.url + child.url:
.state('frontend', { url: '/',...
{ routeName 'frontend.home', url: '/home',..
'/' + '/home' === '//home'
但同样,ui-router
内置了一个很好的解决方案:
小引用:
如果您想要使用绝对网址匹配,则需要在网址字符串前加上一个特殊符号&#39; ^&#39;。
$stateProvider
.state('contacts', {
url: '/contacts',
...
})
.state('contacts.list', {
url: '^/list',
...
});
解决方案: (在这种情况下非常简单)
而不是这个网址def:
{
id: 1,
routeName 'frontend.home',
title: 'Homepage',
url: '/home',
...
我们只会路径 url: '^/home',
:
{
id: 1,
routeName 'frontend.home',
title: 'Homepage',
url: '^/home',
...
答案 1 :(得分:4)
由于您的home-state来自前端状态,因此从frontend-url添加了额外的斜杠。 要删除额外的初始斜杠,请将前端状态设置为“abstract”并清除URL,如下所示:
.state('frontend', {
abstract: true,
url: '',
templateUrl: 'yourTemplate.html'
})
这更好地对应于您的结构,因为从不使用前端状态URL。