【问题标题】:AngularJS - ui router - Cannot match url param key with exclamation markAngularJS - ui路由器 - 无法将url参数键与感叹号匹配
【发布时间】:2020-02-06 10:12:18
【问题描述】:

我的应用中有多个状态,我使用这样的 $stateProvider 定义:

.state(STATES.s1,
  {
    url: "/?refnr"
    template: ...
  })
.state(STATES.s2,
  {
    url: "/?details&searchID&pos"
    template: ...
  })

现在我想要第三种状态,我想要捕获所有包含 包含特定 url 参数的 url,其中包括感叹号。这是参数 'emp!',在 url 中看起来像这样,值为“.../?emp!=45”。 我将此定义为我的状态:

.state(STATES.s3,
  {
    url: "/?emp!"
    template: ...
  })

不起作用。它与 url 不匹配。我还尝试使用 $urlMatcherFactoryProvider 并提供已编译的匹配器作为 url,但结果相同。 我也尝试使用编码版本!在我的状态 url 定义中是这样的:

url: "/?emp%21" 

还是一样的结果。

为什么会这样?我怎样才能匹配这些网址?

【问题讨论】:

  • STATE 对象包含什么? (即 STATE.s1、STATE.s2 等)。它应该是 .state( { url: "/?refnr" template: ... })
  • 我认为你没有抓住重点......我的状态定义有效。我只是无法将 url 与该模式匹配。
  • 好的,知道了。我试过这个fiddle。它适用于 url 的 with !标记
  • 我认为这是因为与 href 链接.. 直接调用此 url 不会打开此状态.. 不幸的是,我无法在您的小提琴中进行直接 url 调用
  • 但是您的小提琴很奇怪..当您将href更改为此时,它仍然调用2.状态:

标签: angularjs angular-ui-router


【解决方案1】:

您可以使用虚假参数的技巧作为此示例,这将处理您所有以“/?emp!”结尾的网址。

.state(STATES.s3,
  {
    url: "/:anyurl/?emp!"
    template: ...
  })

【讨论】:

  • 我已经按照您的建议尝试了“路径”,但它不起作用。首先,你总是需要一个路径,所以我无法匹配没有路径的 url(即“host”/?emp!)。其次,当你没有这样的感叹号时,也会调用状态 s3: “主机/路径/?emp”
  • @akcasoy 你看到我做的小提琴了吗?那不是路径而是路径参数,这意味着 /:any/anythingyouneed 可以是任何路径,您只需根据需要处理最后一部分。 jsfiddle.net/pmc0gt3v
  • 我不想有一个额外的路径参数。我想用这个特定的参数匹配所有的 url。所以从你的 about url 中删除这个额外的部分,如下所示:About 它仍然不起作用。
【解决方案2】:

试试这样的。花括号之间的表达式是符合您的条件的正则表达式。

.state(STATES.s3, {
  url: "/{^\?.*emp!$}"
  template: ...
})

该正则表达式将匹配以? 开头、以! 结尾并且在! 之前有emp 的网址。喜欢:

  • ?麻!
  • ?param=value&temp!

【讨论】:

  • 你能建立一个可以测试的演示应用吗?我只是作为方向回答,而不是经过测试的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多