加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – UI路由器,在服务中使用stateparams

发布时间:2020-12-17 07:07:48 所属栏目:安全 来源:网络整理
导读:我有这种状态: .state('admin.category',{ url: '/category',templateUrl:'views/admin.category.html',resolve:{ category: ['CategoryLoader',function(CategoryLoader){ return new CategoryLoader(); }] },}) 这是我解决的服务. .factory('CategoryLoad
我有这种状态:

.state('admin.category',{
    url: '/category',templateUrl:'views/admin.category.html',resolve:{
      category: ['CategoryLoader',function(CategoryLoader){
        return new CategoryLoader();
      }]
    },})

这是我解决的服务.

.factory('CategoryLoader',['Category','$state','$q',//console.log($state)
  function(Category,$state,$q){
    return function(){
      var delay = $q.defer();
      Category.get({cat_id:$state.params.id},//not working
        function(category){
          delay.resolve(category);
        },function(){
         //delay.reject('Unable to fetch category ' + $state.params.cat_id)
      });
      return delay.promise;
    }
}]);

如果我将$state.params.id更改为数字,一切都有效.如果我在我的服务中安装$state,我会得到所有内容,包括params.但我似乎无法使用它.它应该是使用$route.current.params.id的平等,我在其他项目中使用过它.如何使用ui-router做同样的事情?

更新:更多信息

家长州:

.state('admin',{
    abstract: true,url: '/admin',templateUrl:'views/admin.html'
  })

分类工厂:

factory('Category',function($resource){
    return $resource('/api/category/byId/:id/',{id: '@id'});
  })

如果必要,我会把小提琴放在一起

解决方法

我在这里看到的问题是你在状态准备好之前尝试访问$stateParams.更改状态时会发生几个事件.

首先是$stateChangeStart,在这里您将收到有关您要更改和来自的状态以及两个州的所有参数的通知.

在此之后,决心开始发生.在你的情况下解决方案是调用一个使用$stateParams的函数

一切都解决好了(没有拒绝或错误),并且在$stateChangeSuccess事件之前,state params are updated in the $stateParams object.

基本上,在状态更改完成之前,您无法通过$stateParams对象访问要更改的状态的参数.如果状态更改被拒绝且无法更改,则执行此操作.在这种情况下,前一个状态仍然存在,前一个状态的参数将在$stateParams中.

作为快速解决方法,您可以使用$stateChangeStart事件访问toParams(您要更改的状态的参数)并将它们放在某处($rootScope或服务),以便您可以在需要时访问它们.

以下是$rootScope的快速示例

.run(['$rootScope',function($rootScope){
    $rootScope.$on('$stateChangeStart',function (event,toState,toParams,fromState,fromParams) {
        $rootScope.toParams = toParams;
    });
}]);

.factory('CategoryLoader',['$rootScope','Category',function($rootScope,Category,$q){
    return function(){
      var delay = $q.defer();
      Category.get({cat_id: $rootScope.toParams.id},// <-- notice its using the object we put in $rootScope,not $state or $stateParams
        function(category){
          delay.resolve(category);
        },function(){
         //delay.reject('Unable to fetch category ' + $state.params.cat_id)
      });
      return delay.promise;
    }
}]);

此外,我认为您的资源未设置为正确使用您传递的ID.您正在使用上面的cat_id,为了将其链接到URL的:id,您必须将其映射为`{id:’@ cat_id’}

factory('Category',{id: '@cat_id'});
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读