【问题标题】:Angular Nested states not working as expected角嵌套状态未按预期工作
【发布时间】:2014-09-02 07:42:10
【问题描述】:

有人能看出为什么这不起作用吗? /series 没有加载图库,但 /series/:id/seasons 部分正在工作。 (这不是缺少 ng-view 问题,请参阅下面的工作代码!)

angular.module('xbmcremoteApp')
  .config(function ($stateProvider) {
    $stateProvider
      .state('series', {
        url: '/series',
        templateUrl: 'app/series/series.html',
        controller: 'SeriesCtrl'
      }).state('series.gallery', {
        url: '',
        templateUrl: 'app/series/series-gallery/series-gallery.html',
        controller: 'SeriesGalleryCtrl'
      }).state('series.seasons', {
        url: '/:id/seasons',
        templateUrl: 'app/series/seasons/seasons.html',
        controller: 'SeasonsCtrl'
      });
  });

如果我把它改成这个它可以工作,但这不是我想要的:

angular.module('xbmcremoteApp')
  .config(function ($stateProvider) {
    $stateProvider
      .state('series', {
        url: '',
        templateUrl: 'app/series/series.html',
        controller: 'SeriesCtrl'
      }).state('series.gallery', {
        url: '/series',
        templateUrl: 'app/series/series-gallery/series-gallery.html',
        controller: 'SeriesGalleryCtrl'
      }).state('series.seasons', {
        url: '/series/:id/seasons',
        templateUrl: 'app/series/seasons/seasons.html',
        controller: 'SeasonsCtrl'
      });
  });

编辑和解决方案:
我的帖子缺少一些信息。为了清楚起见:
我想在调用 /seriesurl 时显示一个画廊。我想用季节网址显示季节。没有更多的意见!
找到了一个非常简单的解决方案。将 abstract 属性设置为 true 会强制 stateprovider 使用子视图。

....
.state('series', {
    abstract:true,  //adding this line makes the states work as expected
    url: '/series',
    templateUrl: 'app/series/series.html',
    controller: 'SeriesCtrl'
  })
....

【问题讨论】:

    标签: angularjs nested state angular-ui-router


    【解决方案1】:

    在第一个定义中,url /series 被评估为根状态 'series'

    .state('series', {
        url: '/series',          // url evaluation will stop here, because
        ...                      // there is a match for /series
      }).state('series.gallery', { // this will never be reached via url
        url: '',                   // but ui-sref="series.gallery" will work
        ...
    

    虽然第二个映射确实区分了两种状态,但 '/series' 将导航到 'series.gallery' 状态:

    .state('series', {
        url: '',                   // url like "#" will navigate there
        ...
      }).state('series.gallery', { // url /series will trigger this child state
        url: '/series',
        ...
    

    一般来说,如果状态在 url 上是唯一的,那么它们中的每一个都应该有一些定义。所以很可能这应该按预期工作:

    .state('series', {
        url: '/',                   // url like "#/" will navigate to series
        ...
      }).state('series.gallery', { // url '/series' will trigger this
        url: '^/series',
        ...
    

    查看魔法标志:^

    如果你想进行绝对 url 匹配,那么你需要在你的 url 字符串前面加上一个特殊符号 '^'

    【讨论】:

    • 但为什么 /series/:id/season 在这两种定义中都有效?即使根状态有 /series url!您对^的建议与我的第二个解决方案有何不同?
    • 我的建议(只是建议)只是为了向您展示,该系列可以有 url '/' 和 series.gallery 将有 '/series',而在您的第二个映射中,“系列”什么都没有: ''。 'series.seasons' 实际上是 'series' 的子对象,因此应用了相同的原则。如果父母是''并且季节是'/series/:id/season',那么它的组合是'' + '/series/:id/season'。在您的第一个映射中,concat 具有相同的结果'/series/' + ':id/season'。这真的是非常简单的原则......没有什么可以完成的。有帮助吗?
    • 好的,我明白你的意思,但在我看来,这行不通,我想。但是我可能不得不考虑我的“孩子”概念。为什么我这样做是因为父级提供了一个模板,该模板适用于以 /series 开头的每个 url,并且只包含该模板内的特定视图。我不知道如何以其他方式解决这个问题。我更新了我的帖子顺便说一句。因为我现在找到了适合我的解决方案。谢谢你:)
    • 嗯,将状态标记为抽象意味着,该状态不能直接访问,只能访问其子级。所以我怀疑你是否找到了解决方案。也许你应该重新检查我的答案。所有子状态,都继承父 url。仅当有^ 时,url 从根开始。这应该是我想说的解决方案;)但很高兴你做到了..
    • 哦,对不起...这正是我想要实现的。我没有说明这一点,因为拥有/series 的父母和带有空网址的孩子意味着我只希望孩子可以访问。为了清楚起见,我想在调用 /seriesurl 时显示一个画廊。我想展示季节。没有更多的观看次数!
    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多