除了 ui-router 之外,我正在使用 ui-bootstrap 的$modal
服务。
我在resolve
的{{1}}属性(使用url参数)上使用onEnter
s(实际上在模态内传递)来激活模态(如{{3}中所述) ui-router)。
我尝试访问state
,但是当解决时,它似乎是空对象。
$stateParams
这是一个docs|FAQ用于演示目的。
答案 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});
}];
}