对于以下状态定义和url http://localhost/#/foo/bar
,我希望收到控制台输出
/foo
/foo/bar
但是,我只得到一个/foo
。我的期望是错的吗?我该怎么做才能调用父控制器?
$stateProvider
.state('foo', {
url: '/foo',
controller: function($scope) {
console.log('/foo')
},
abstract: true
})
.state('bar', {
parent: 'foo',
url: '/bar',
controller: function($scope) {
console.log('/foo/bar')
}
})
更新
更奇怪的是,当我添加
时onEnter: function() {
console.log('enter')
}
打印 enter
(但不是/foo/bar
)。
更新2
我想在父路由中添加resolve
属性,并让所有子节点等待延迟解析,直到它们的控制器被实例化为止。这是它的结果:https://github.com/angular/angular.js/issues/5854范围用于存储延迟的结果(这是一个$ http响应)。
答案 0 :(得分:1)
在抽象父状态上,应该有一个ui-view
指令,以便子状态知道自己插入的位置。
.state('foo', {
url: '/foo',
abstract: true,
controller: function($scope) {
console.log("/foo");
},
template: '<ui-view/>'
})
以下是一个工作示例:http://plnkr.co/edit/OskGCBSQGhEXlxaNLZtD?p=preview
更新2回复
您应该只能将解析添加到抽象父状态:
resolve: {
user: function($q, $timeout) {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve("a resolved user");
}, 1000);
return deferred.promise;
}
}
以下是一个有效的例子:http://plnkr.co/edit/cm0xUP8LmruHiVBhccuf?p=preview
答案 1 :(得分:0)
是的,你的期望是错误的:只匹配一条路线。如果您想匹配第二条路线,则需要将网址设置为/foo/bar
,但是无法通过一个网址同时点击它们。
我不确定您要尝试做什么,但如果您想访问网址参数,可以使用/foo/:paramName
和$routeParams
服务。