【问题标题】:Accessing ui-router state params from an attribute-type directive (NOT a component)从属性类型指令(不是组件)访问 ui-router 状态参数
【发布时间】:2017-09-13 20:33:31
【问题描述】:

我们正在从一个非常旧版本的 UI 路由器升级到 v1.0.5,我在尝试替换我们已弃用的 $stateParams 使用时遇到了问题。举一个简化的例子,我们有一个unique-name 属性类型指令,我们在表单字段上使用来进行验证检查,以确保字段中的文本是唯一的名称。我们的想法是,我们要么添加新的 doohickey,要么更改现有 doohickey 的名称,并且我们希望确保没有其他 doohickey 具有相同的名称。

在我们的旧代码中,我们可以像这样从$stateParams 中获取doohickeyId 值:

function uniqueName(doohickeySearchService, $stateParams, $q) {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {
                ctrl.$asyncValidators.uniqueName = function (modelValue) {
                    // use doohickeySearchService to look up foundDoohickey by name
                    // then...
                    return foundDoohickey.id !== $stateParams.doohickeyId;
                };
            }
        };
    }

可能过于简单了,但问题的核心是:我们如何在不使用已弃用的$stateParams 的情况下访问doohickeyId 值?有一个从 url 获取它的父状态,类似于/doohickey/{doohickeyId:int}/edit,如状态定义中所指定。

我可以使用$state 来获取$current 状态,以及来自path 属性的状态数组,我什至可以在路径中的一个状态中看到doohickeyId 参数。不幸的是,如果我采用参数的value(),它会返回未定义,即使$stateParams 具有正确的doohickeyId 值。我还尝试添加 doohickeyId 作为父状态的解析,但不幸的是,这并没有在我需要的属性类型指令上提供任何数据。

阅读文档和谷歌搜索正在打开对从子 states 或组件访问父数据的引用,但我试图从属性类型指令而不是状态/零件。有没有办法在不对我们的代码库进行大修的情况下做到这一点?

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    您是否尝试过 UI-Router 文档中的这个解决方案?

    不使用全局 $stateParams 服务对象,

    注入 $uiRouterGlobals 并使用 UIRouterGlobals.params

    MyService.$inject = ['$uiRouterGlobals'];
    function MyService($uiRouterGlobals) {
      return {
        paramValues: function () {
          return $uiRouterGlobals.params;
        }
      }
    }
    

    不使用每个转换的 $stateParams 对象,

    注入当前的Transition(作为$transition$)并使用Transition.params

    MyController.$inject = ['$transition$'];
    function MyController($transition$) {
      var username = $transition$.params().username;
      // .. do something with username
    }
    

    https://ui-router.github.io/ng1/docs/latest/modules/injectables.html#_stateparams

    【讨论】:

    • 这正是我想要的,非常感谢!我在谷歌上搜索它,我反复阅读迁移指南,并且一直在“Injectables”下的文档中。
    • 新的 UI 路由器文档不适合胆小的人或缺乏耐心的人。
    【解决方案2】:

    将数据作为属性类型指令的值传递。然后通过链接函数中的attrs 参数检索它。然后根据范围对其进行评估。

    <input unique-name="{doohickeyId: doohickeyIdFromStateParams}" />
    
    link: function (scope, elm, attrs) {
        var data = scope.$eval(attrs.uniqueName));
    
        console.log('My doohickey ID is: ', data.doohickeyId);
    
    }
    

    【讨论】:

    • 这适用于我给出的(过于简单的)示例,但原始代码将使这更加复杂。如果这是最好的答案,我会接受。但是有什么方法可以像以前一样在$stateParams 中获取数据?谢谢。
    【解决方案3】:

    我离线找到了答案,但我想将其发布在这里以供将来参考。我们决定采用的方法是建立我们自己的自定义全局状态服务来保存状态参数。所以在app/app.js 中,我们在app.run() 中有类似的内容:

    $transitions.onFinish({}, function ($transition$) {
        customStateService.setCurrentStateParams($transition$);
    });
    

    然后我们可以在任何需要的地方注入 customStateService,并调用 getCurrentStateParams() 函数来检索在最近成功的状态转换中可用的任何参数,类似于我们之前使用 $stateParams 的方式。

    【讨论】:

    • 有效,但不是最佳答案。请参阅已接受的答案以获得更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多