为什么要给一个 "abstract: true" 状态一个 url?
Why give an "abstract: true" state a url?
我今天一直在摆弄 ui-router,试图更好地理解 Ionic 中的脚手架,我注意到的一件事是它们给出了 "tabs" 的抽象状态 url。
我唯一一次使用抽象状态,我使用空字符串作为 url 我注意到如果我不小心尝试导航到抽象状态(而不是子状态)我得到错误:
Cannot transition to abstract state '[insertAbstractStateHere]'
编辑:
"Moreover, in experimenting, when I try to assign a url to my abstract state (outside of Ionic) and still render the nested state views, I get a big goose egg. Nothing shows up at all."
以上引用的说法是错误的!我在 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 non-navigable 的一部分时保持您的定义 干燥 。例如,假设您有一个如下所示的 url 方案:
/home/index
/home/contact
但是,无论出于何种原因在您的设计中,此 url 无效(即页面没有任何用途):
/home
现在您可以简单地为这种情况创建两个状态,具有完整的 urls,但是您将写 /home/
两次,并且描述有点复杂。相反,最好的想法是创建一个主页摘要 parent,其中其他两个状态是 children(对于 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'
})
请注意,在 parent 状态中,我们分配了一个模板,其唯一的 child 是 ui-view
。这确保 children 被渲染(这可能是你的显示空白的原因)。
有时您可能会注意到使用带有空白的抽象状态 url。此设置的最佳用途是当您需要 parental resolve
时。例如,您可能需要一些特定的服务器数据用于您的一部分状态。因此,您可以创建一个具有所需分辨率的空白 url parent,而不是将相同的解析函数放入您的每个状态。如果你想要分层控制器,它也可能很有用,其中 parent 对视图没有用处(不确定你为什么想要这个,但它是合理的)。
使用抽象状态,同时启用 ui 路由器进行导航而无需重新加载 controller/page。
.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-router,试图更好地理解 Ionic 中的脚手架,我注意到的一件事是它们给出了 "tabs" 的抽象状态 url。
我唯一一次使用抽象状态,我使用空字符串作为 url 我注意到如果我不小心尝试导航到抽象状态(而不是子状态)我得到错误:
Cannot transition to abstract state '[insertAbstractStateHere]'
编辑:
"Moreover, in experimenting, when I try to assign a url to my abstract state (outside of Ionic) and still render the nested state views, I get a big goose egg. Nothing shows up at all."
以上引用的说法是错误的!我在 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 non-navigable 的一部分时保持您的定义 干燥 。例如,假设您有一个如下所示的 url 方案:
/home/index
/home/contact
但是,无论出于何种原因在您的设计中,此 url 无效(即页面没有任何用途):
/home
现在您可以简单地为这种情况创建两个状态,具有完整的 urls,但是您将写 /home/
两次,并且描述有点复杂。相反,最好的想法是创建一个主页摘要 parent,其中其他两个状态是 children(对于 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'
})
请注意,在 parent 状态中,我们分配了一个模板,其唯一的 child 是 ui-view
。这确保 children 被渲染(这可能是你的显示空白的原因)。
有时您可能会注意到使用带有空白的抽象状态 url。此设置的最佳用途是当您需要 parental resolve
时。例如,您可能需要一些特定的服务器数据用于您的一部分状态。因此,您可以创建一个具有所需分辨率的空白 url parent,而不是将相同的解析函数放入您的每个状态。如果你想要分层控制器,它也可能很有用,其中 parent 对视图没有用处(不确定你为什么想要这个,但它是合理的)。
使用抽象状态,同时启用 ui 路由器进行导航而无需重新加载 controller/page。
.state('home', {
url: '/home',
abstract:true,
controller: "HomeController",
templateUrl:"path to your html"
})
.state('home.list', {
url:"",
controller: "HomelistController",
templateUrl:"path to your html"
})