为什么给一个“抽象:真实”的状态一个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路由器做导航,你可以重新加载控制器/页面。