为什么给一个“抽象:真实”的状态一个url?
今天我正在用ui-router来摆弄一下,试图更好地理解Ionic中的脚手架,而我注意到的一件事情是,他们给了“制表符”一个url的抽象状态。
我曾经使用抽象状态的唯一情况是,我使用了一个空string作为url,并且我注意到,如果我偶然尝试导航到一个抽象状态(而不是子状态),我得到错误:
无法过渡到抽象状态'[insertAbstractStateHere]'
编辑:
“而且,在试验中,当我尝试给我的抽象状态(Ionic之外)分配一个url并且仍然呈现嵌套的状态视图时,我得到一个巨大的鹅蛋,根本没有任何显示。
以上引用的声明是错误的! 我在Plunker再次尝试,并且嵌套状态显示出来。
angular.module('routingExperiments', ['ui.router']) .config(function($urlRouterProvider, $stateProvider) { $stateProvider .state('abstractExperiment', { abstract: true, url: '', //<--- seems as if any string can go here. templateUrl: 'abstractExperiment.html' }) .state('abstractExperiment.test1', { url: '/test1', templateUrl: 'abstractTest1.html' }); });
显然我确实做错了。 所以我的新问题是:
为什么在抽象状态中使用命名状态而不是空string,还是仅仅是一种样式select?
您将使用抽象状态的原因是当您的url的一部分不可导航时,保持您的定义干燥 。 例如,说你有一个像下面这样的urlscheme:
/home/index /home/contact
然而,无论你在devise中的任何原因,这个url是无效的(即没有一个页面的目的):
/home
现在,您可以简单地为这种情况创build两个状态,但是完整的URL将被写入/home/
两次,而且描述更复杂一些。 最好的想法是创build一个家庭抽象父母,其他两个国家是儿童(对于路由器文档):
$stateProvider .state('parent', { url: '/home', abstract: true, template: '<ui-view/>' }) .state('parent.index', { url: '/index', templateUrl: 'index.html' }) .state('parent.contact', { url: '/contact', templateUrl: 'contact.html' })
只要注意,在父状态中,我们分配一个模板,其唯一的孩子是一个ui-view
。 这可以确保孩子们呈现(也可能是你为什么显示空白)。
有时候你可能会注意到一个空白url的抽象状态。 这种设置的最佳用途是当你需要父母的resolve
。 例如,您可能需要一些特定的服务器数据作为您的州的一个子集。 所以,而不是把相同的parsing函数到你的每个国家,你可以创build一个空白的URL父所需的决心。 如果你想要层次控制器,父类没有用于视图(不知道你为什么要这样做,但是这似乎是合理的),它也可能是有用的。
.state('home', { url: '/home', abstract:true, controller: "HomeController", templateUrl:"path to your html" }) .state('home.list', { url:"", controller: "HomelistController", templateUrl:"path to your html" })
使用抽象的状态,也使ui路由器做导航,你可以重新加载控制器/页面。