ui-router:$ stateParams在解析中为空

时间:2014-10-30 07:18:58

标签: angularjs angular-ui-router

除了 ui-router 之外,我正在使用 ui-bootstrap $modal服务。

我在resolve的{​​{1}}属性(使用url参数)上使用onEnter s(实际上在模态内传递)来激活模态(如{{3}中所述) ui-router)。

我尝试访问state,但是当解决时,它似乎是空对象

$stateParams

这是一个docs|FAQ用于演示目的。

2 个答案:

答案 0 :(得分:4)

UI-Router无法控制您的$ modal调用。如果您希望UI-Router注入它们,则结果应该继续进行状态定义。

var state = {
  url: '{id}',
  name: 'parent.child',
  resolve: { getY: getYfn }, // moved from $modal call
  onEnter: function(getY) { // injected into onEnter
    $modal.open({
      resolve: { getY: function () { return getY; } }, // passed through to $modal.open
      controller: 'ChildCtrl as child', // ChildCtrl injects getY
    });
  }
}

答案 1 :(得分:3)

只是发布此内容以防有人遇到同样的问题......

我遇到了与原问题相同的问题但选择的答案对我没有太多帮助,因为我无法访问我的模态控制器内部状态直接定义的分辨率。

但是,我注意到在onEnter函数中仍然可以访问$ stateParams,所以可以在这里创建一个变量,然后在$ modal.open()函数中使用这个变量。

.state('parent.child', {
      url: 'edit/:id',
      // If defining the resolve directly in the state
      /*resolve: { // Here $stateParams.id is defined but I can't access it in the modal controller
          user: function($stateParams) {
            console.log('In state(): ' + $stateParams.id);
            return 'user ' + $stateParams.id;
          }
      },*/
      onEnter: function($modal, $stateParams, $state) {
        var id = $stateParams.id; // Here $stateParams.id is defined so we can create a variable
        $modal.open({
          templateUrl: 'modal.html',
          // Defining the resolve in the $modal.open()
          resolve: { 
              user: function($stateParams) {
                console.log('In $modal.open(): ' + $stateParams.id); // Here $stateParams.id is undefined
                console.log(id); // But id is now defined
                return 'user ' + id;
              }
          },
          controller: ChildCtrl,
          controllerAs: 'ctrl'
        })
        .result
        .then(function(result) {
            return $state.go('^');
        }, function(reason) {
            return $state.go('^');
        });
      }
    })

以下是plnkr示例:http://plnkr.co/edit/wMMXDSsXLABFr0P5q2On

另外,如果需要在配置对象之外定义resolve函数,我们可以这样做:

var id = $stateParams.id;
$modal.open({
    resolve: {
        user: myResolveFunction(id)
    },
    ...
});

function myResolveFunction(id) {
    return ['MyService', function(MyService) {
        console.log('id: ' + id);
        return MyService.get({userId: id});
    }];
}