Angularjs UI路由器控制器在解析后不会更新

时间:2014-08-28 12:19:37

标签: javascript angularjs angular-ui-router resolve

我在Angularjs中使用ui-router时遇到问题。场景非常简单,我有一个用户列表,当我点击用户的名字时,视图将跳转到编辑表单(这个也是create-new-user表单)。

但问题是,解析编辑状态后返回的值不会改变。好像控制器没有更新新状态。 *(在我的真实项目中尝试使用$ state.reload但没有成功)

以下是我的plnkr供参考:http://plnkr.co/edit/Gv8sQk7ixfni6tzhqjn3

这是我的路由配置:

$stateProvider
    .state('list',{
      url:'/',
      templateUrl:'list.html',
      controller:'mainCtrl',
      resolve:{
        listUser: function(userService){
          return userService.list();
        }
      }
    })
    .state('user',{
      url:'/user',
      templateUrl:'form.html',
      controller:'userCtrl',
      resolve:{
        objUser: function(userService){
          // Init a new "User" object
          console.log("New user");
          return "New name";
        }
      }
    })
    .state('user.edit',{
      url:'/:id',
      templateUrl:'form.html',
      controller:'userCtrl',
      resolve:{
        objUser: function(userService, $stateParams){
          // Return the user 
          console.log("Edit user ", userService.get($stateParams.id));
          return userService.get($stateParams.id);
        }
      }
    });

我在解决步骤中创建所有必需对象的原因是在阅读了本文Advanced routing and resolves后,我发现自己处于循环中,我在控制器中执行所有请求,当然,重复的代码是有一点我无法避免。所以,我试图通过改变处理数据的方式来改善它,但现在卡住了。

有人能指出我出错的地方吗?非常感谢它。

2 个答案:

答案 0 :(得分:1)

在user.edit之后调用用户状态的resolve函数,并覆盖它。

这似乎是这里引用的一个问题: https://github.com/angular-ui/ui-router/issues/868

您可以在https://github.com/angular-ui/ui-router/issues/78Promise dependency resolution order in angular ui-router

获取一些额外信息

答案 1 :(得分:1)

我想说,你的想法并不坏。如果我们应该遵循它,我会使user_new和user_edit状态兄弟姐妹。查看更新的version

.state('user_new',{
      url:'/user',
      templateUrl:'form.html',
      controller:'userCtrl',
      resolve:{
        objUser: function(userService){
          // Init a new "User" object
          console.log("New user");
          return "New name";
        }
      }
    })
.state('user_edit',{
      url:'/:id',
      templateUrl:'form.html',
      controller:'userCtrl',
      resolve:{
        objUser: function(userService, $stateParams){

          // Return the user 
          console.log("Edit user ", userService.get($stateParams.id));
          return userService.get($stateParams.id);
        }
      } 
    })

然后,我们可以修改 user_edit 上的现有内容,并在 user_new 上创建新内容。事实上,这两个州不需要是亲子,因此解析器可以将不同的 userObj 传递给每个......

检查here