【问题标题】:UI Router conflicting when using similar URL pattern使用类似 URL 模式时 UI 路由器冲突
【发布时间】:2015-11-09 09:16:02
【问题描述】:

我的 app.config 中定义了以下 2 个状态:

state('product-details', {
    url: '/products/:productId',
    templateUrl: '/pages/product-details/product-details.tmpl.html',
    controller: 'ProductDetailsController'
})

state('product-register', {
    url: '/products/register',
    templateUrl: '/pages/product-register/product-register.tmpl.html',
    controller: 'ProductRegisterController'
})

我面临的问题是,由于它们的 URL 模式相似,当我尝试导航到 product-register 状态时,“注册”被 angularui-router 解释为 productId 并将我重定向到 product-details改为状态。

在解决了一些关于 SO 的类似问题后,我想我会使用正则表达式过滤这些 URL,如 here 所述。但是当我尝试这个时,虽然正则表达式单独匹配正确,但状态拒绝改变。

在做了一些研究之后,我决定像这样合并这两个状态:

state('product-details', {
     url: '/products/:param',
    templateUrl: ['$stateParams', function($stateParams) {
        if($stateParams.param === 'register') {
            return '/pages/product-register/product-register.tmpl.html';
        } else {
            return '/pages/product-details/product-details.tmpl.html';
        }
    }],
    controller: ['$stateParams', function($stateParams) {
        if($stateParams.param === 'register') {
            return 'ProductRegisterController';
        } else {
            return 'ProductDetailsController';
        }
    }]
})

这似乎也没有按预期工作。我错过了什么?这不是很正常的事情吗?

【问题讨论】:

  • 你不能把你的路线描述为url: '/products/detail/:productId'吗?
  • 我可以,但这不是我的意思:)

标签: angularjs angular-ui-router


【解决方案1】:

尝试将“产品注册”状态移至“产品详细信息”状态之前。

实际上,您需要区分您的状态 URL 模式,否则 Angular 将触发它找到的第一个匹配项。

【讨论】:

  • 谢谢!有趣的是,切换顺序并没有将问题传递给另一个状态。现在两者都可以工作
【解决方案2】:

您应该能够为参数指定类型以仅匹配某些状态。

在您的情况下,您可以使用:

url: '/products/{productId:int}'

在 ui 路由器页面上还有很多其他示例: https://github.com/angular-ui/ui-router/wiki/URL-Routing

【讨论】:

  • 这似乎可行,但是我的 id 是字符串
  • 您的 id 是否有任何可以使用正则表达式的已定义模式?否则,如果不进一步区分 url,可能会很困难:/
  • 你需要有状态的唯一标识符,一种方法,如果你有一些模式可以使用正则表达式(Ui.Router 有一个基本的支持)......但是,最好的解决方案是具有唯一标识符...
  • 如果我们无法控制怎么办?我的情况是,我无法知道“/products”是类别还是 cms 页面:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多