【问题标题】:Setting dynamic parameters in URL with Angular UI Router使用 Angular UI Router 在 URL 中设置动态参数
【发布时间】:2015-09-11 01:39:24
【问题描述】:

我正在使用查询系统,它允许用户从动态字段列表构造查询,并且我想在 URL 中保留查询。

通常我会这样做:

$stateProvider.state('alerts', {
                url: '/alerts/list?p1&p2&p3'
            })

在控制器中,我可以使用 $stateParam 读取参数:

console.log($stateParams.p1)

我可以通过以下方式将查询保存在 URL 中:

$state.go($state.current, {p1:'1', p2: '2'}, {location: true, inherit:true, notify:false})

但问题是我不能声明所有参数。

我想做:

$state.go($state.current, {p1:'1', p2: '2', p3:'3', p4: '4', p5:'5'}, {location: true, inherit:true, notify:false})

但 ui-router 会忽略未声明状态的参数。

我知道 $location.search 可以让我访问 URL 搜索部分,但我如何设置 URL(不更改状态和重新加载页面)?

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    这对我有用:

    $stateProvider.state("alerts", { url: "/alerts/list?{query:json}" });
    

    $state.go($state.current, {query: {a:1, b:2, c: '3'}}, {location: true, inherit:true, notify:false})
    

    【讨论】:

    • 这适用于它所使用的页面,但是当您尝试导航时,您可能会间歇性地遇到一个称为“重新加载状态错误”的已知问题(如一些 ui-router 的 GitHub 问题页面中所讨论的)您在此 $state.go 中设置的某些参数将应用于您访问的下一个状态,或者控制器不必要地重新加载,或其他问题。
    【解决方案2】:

    one of angular-ui's Github issue pages 上进行了很长时间的讨论,可以追溯到 2013 年。到目前为止,没有一个答案让每个人都满意,我是不满意的人之一。

    到目前为止,最好的解决方法是仅使用查询参数(而不是 url 路径参数)并将 reloadOnSearch: true 选项添加到您计划使用动态查询参数的状态(在不重新加载页面的情况下更改它们)。这在a different StackOverflow answer here 中进行了讨论。

    截至我写这篇文章的那一天,有一个 angular-ui 的分支,其中有一个叫做“动态参数”的东西,现在在 master 后面 300 次提交,但可能已经解决了问题(但现在它已经远远落后于 master 了我不想使用它)。还有一个即将发布的 1.0 版本的 ui-router,但我不知道什么时候发布。

    【讨论】:

    • 我不记得找到解决此问题的方法。在写完这个问题大约一年后,我也切换到了另一个框架,所以我不再研究它了。
    【解决方案3】:

    确保您使用的是最新的 1.x ui-router - 这很重要。然后在您的路线中,在参数设置中使用 dynamic: true 。这将阻止刷新。像往常一样使用 ui-sref - 根本不要使用任何通知/重新加载/定位的东西,因为它会破坏事情 - 动态负责在后台正确设置这些内容。使用 value 您可以设置一个默认值,如果 URL 为空(设置为 '' - 不为空),则 squash 会删除 URL 中的尾部斜杠。

    .state('myappstate.somestate', {
            url: '/:a/:b/:c/:d',
            params: {
                a: {dynamic: true, value: 'someDefault'},
                b: {dynamic: true, value: 'anotherDefault'},
                c: {dynamic: true, value: '', squash: true},
                d: {dynamic: true, value: '', squash: true}
            }
        })
    

    【讨论】:

    • 感谢更新的答案,但问题是我们现在如何区分使用 $state.go(动态参数)和使用浏览器后退按钮返回的路线更改?
    • 哇,遇到了类似的问题,就是位置:'replace' 破坏了一切!动态变量确实负责所有这些。谢谢!
    猜你喜欢
    • 2015-10-14
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多