2014-10-30 71 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}); 
    }]; 
}