未针对嵌套状态(angular ui)启动父范围

时间:2014-08-26 20:33:35

标签: javascript angularjs angular-ui angular-ui-router

对于以下状态定义和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响应)。

2 个答案:

答案 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服务。