2014-10-30 74 views
1

除了UI路由器空,我使用UI的自举$modal服务。

我用的state(与URL参数)的onEnter财产resolve S(一个模式内实际传递)来激活情态动词(如在UI路由器的docs|FAQ提到)。

我试图访问$stateParams,但它似乎是一个空物件当决议火灾时。

function onEnter($modal, $state) { 
    // simple handler 
    function transitionToOverlay() { 
    return $state.transitionTo('parent'); 
    } 

    // actual modal service 
    $modal 
    .open({ 
     size: 'sm', 
     resolve: { getY: getY }, 
     controller: 'ChildCtrl as child', 
     template: template 
    }) 
    .result 
    .then(transitionToOverlay) 
    .catch(transitionToOverlay); 
} 

// resolve 
function getY($state, $stateParams) { 
    console.log('State resolve getY...'); 
    console.log($stateParams); // returns {} empty object 
    return 'y'; // just a dummy resolve 
} 

出于演示目的,这里是plnkr

回答

3

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 
    }); 
    } 
} 
+0

我不认为这允许我们将控制器的决心“注入”它。 – srph 2015-01-17 07:13:07

+0

@srph查看已更新回答 – 2015-01-17 16:58:02

+0

谢谢。但是,如果可能我在''''controller'''中使用'''modal''',我该如何访问'''resolve'''? – srph 2015-01-17 18:34:16

3

万一有人就在发布此有同样的问题...

我有同样的问题,因为在原来的问题,但所选择的答案并没有帮助我太多,因为我做不到可以访问在我的模态控制器中直接定义的状态。

但是,我注意到$ stateParams仍然可以在onEnter函数中访问,所以可以在这里创建一个变量,然后在$ 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

而且,如果需要定义配置对象之外的决心功能,我们可以做这样的:

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}); 
    }]; 
}