我今天试图更好地理解Ionic的脚手架,我注意到的一个事情是,他们给抽象的状态的“标签”一个url。
我只使用抽象状态,我使用一个空字符串作为url,我注意到,如果我不小心尝试导航到抽象状态(而不是子状态),我得到的错误:
Cannot transition to abstract state ‘[insertAbstractStateHere]’
编辑:
“此外,在实验中,当我尝试为我的抽象状态(在离子之外)分配一个url并且仍然渲染嵌套状态视图时,我得到一个大鹅蛋,没有什么显示。
上面引用的语句是false!我在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' }); });
显然我的确做错了。所以我的新问题是:
有什么理由为什么在使用抽象状态时使用命名状态而不是空字符串,还是只是一个风格选择?
你将使用抽象状态的原因是当你的一部分你的url不可导航时保持你的定义干燥。例如,假设您有一个类似以下的网址方案:
原文链接:https://www.f2er.com/angularjs/146069.html/home/index /home/contact
不过,无论在您的设计中出于什么原因,此网址无效(即网页没有用途):
/home
现在你可以简单地为这种情况创建两个状态,使用完整的URL,然而,然后你将写/ home /两次,并且描述有点复杂。最好的想法是创建一个主抽象父对象,其他两个状态是子对象(对于ui-router文档):
$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函数放入每个状态,您可以使用所需的解析创建一个空的url父级。它也可以是有用的,如果你想要分层控制器,其中父没有用于视图(不知道为什么你会想要这,但它是可能的)。