【问题标题】:Change route parameter from controller从控制器更改路由参数
【发布时间】:2014-07-02 18:52:37
【问题描述】:

我有这样定义的状态:

stateProvider
        .state('app', {
            templateUrl: 'views/layout.html',
            url: '/:lang/app',
            resolve: {
                lang: ['$rootScope', '$stateParams', function(rootScope, stateParams){
                    return stateParams.lang;
                }]
            }
        });

我为语言定义了按钮,应该导航到完全相同的 url,除了应该更改 lang 参数:

<a ui-sref="???({ lang: 'en' })"> English </a>

有可能吗?

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

    为此我编写了自己的指令:

    angular.module('app').directive('uiSrefParams', ['$state', function(state){
        return {
            restrict: 'A',
            link: function(scope, element, attrs){
                element.click(function(){
                    var params = scope.$eval(attrs['uiSrefParams']);
                    state.go(state.$current, params);
                });
            }
        };
    }]);
    

    用法:

    <a ui-sref-params="{ lang: 'en' }"> English </a>
    

    【讨论】:

      【解决方案2】:

      我想说,这个功能已经内置在ui-router 中。

      1) 如此处所述:

      ui-sref='stateName' - 导航到状态,无参数。 'stateName' 可以是任何有效的绝对或相对状态,遵循与$state.go()

      相同的语法规则

      2) 还有这里的文档

      将转换到的状态的名称或相对状态路径。如果路径以 ^. 开头,则为相对路径,否则为绝对路径。

      一些例子:

      $state.go('contact.detail') will go to the 'contact.detail' state
      $state.go('^') will go to a parent state.
      $state.go('^.sibling') will go to a sibling state.
      $state.go('.child.grandchild') will go to a grandchild state.
      

      3) 最后还有一个plunker,表明这个功能可以开箱即用:

      有2个状态(上面加上它的'app.child')我们可以在'app'状态中使用这个语法

      <a ui-sref=".({ lang: 'en' })"> English </a> 
      <a ui-sref=".({ lang: 'cz' })"> Czech </a>
      <a ui-sref=".child({ lang: 'en' })"> Child English </a> 
      <a ui-sref=".child({ lang: 'cz' })"> Child Czech </a>
      

      这可以用在孩子身上:

      <a ui-sref=".({ lang: 'en' })"> Sibling English </a> 
      <a ui-sref=".({ lang: 'cz' })"> Sibling Czech </a>
      

      观察example 以查看它的实际效果...

      EXTEND:查看来自ui-sref doc的注释

      关于相对 ui-sref 目标的说明:

      您还可以在ui-sref 中使用相对状态路径,就像传递给state.go() 的相对路径一样。 您只需要注意路径是相对于链接所在的状态,即加载包含链接的模板的状态。

      【讨论】:

      • 我尝试了该解决方案,但它没有按预期工作。鉴于应用程序模块,我有切换按钮。 app 模块有子:app.admin 和 app.page;当我在 page.admin 并单击带有 .({ lang: 'en' }) 的锚点时,它把我带到了应用程序模块。如果我在 app.admin 页面中有切换按钮,它会正常工作,但我在布局中有它
      • 如我的示例所示,相对导航正在工作。但是我用doc的解释(即将到来)扩展了答案,必须满足哪些条件。我的建议是:尝试了解相对路径,使用内置解决方案,而不是引入相同的自定义指令......但只是一个建议;)
      • 感谢您的建议。我同意内置解决方案更好用,但我看不到我的问题的内置解决方案。无论如何,您的帖子非常有用
      猜你喜欢
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多