【问题标题】:Angular ui-router: Child not getting Parent stateAngular ui-router:孩子没有获得父母状态
【发布时间】:2015-12-18 17:10:18
【问题描述】:

我有一个使用 ui-router 的 Angular 应用程序,在我的应用程序中定义了以下状态。

$stateProvider
  .state('classes', {
    url: '/classes/:type',
    templateUrl: 'classes.html',
    controller: 'ClassesCtrl',
  })
  .state('classes.detail', {
    url: '/:id',
    views: {
        "@": {
            templateUrl: 'class.html',
            controller: 'ClassCtrl'
        }
    }
  });

我的控制器看起来像:

app.controller('ClassesCtrl', function($scope, $stateParams){
  $scope.foo = "bar";
});
app.controller('ClassCtrl', function($scope, $stateParams){
  console.log($scope.foo);
});

如您所见,class.detail 通过定位未命名的根级 ui-view 来隐藏父视图。我遇到的问题是孩子没有继承父母的范围(我无法在 class.detail 中访问 $scope.foo)。当我进入子状态时,父状态似乎被破坏了,因为如果我点击返回,它必须重新加载所有数据。

如何有效地隐藏父视图但仍然访问父数据?

【问题讨论】:

  • 通过服务共享您的数据
  • 我认为嵌套视图会自动访问父状态?为什么在我的情况下它会被破坏?
  • 在父视图中创建的$scope应该可以被子视图访问吗?

标签: javascript angularjs angular-ui-router


【解决方案1】:

来自 ui-router 文档:

仅限视图层次结构的范围继承

请记住,如果您的状态视图是嵌套的,则范围属性只会沿状态链继承。范围属性的继承与您的状态的嵌套无关,而与您的视图(模板)的嵌套有关。

好吧,您使用@ 来定义您的视图,但您的父状态已命名,因此您应该将其命名为@classes

编辑:made this fiddle解释名称。

【讨论】:

  • 好的,谢谢!如何使用嵌套视图隐藏父视图?
  • 在这种情况下,您将添加一个模板到状态,而不是视图。
  • 所以你说我必须使用一个函数来确定 templateUrl,如下所述:github.com/angular-ui/ui-router/wiki#templates?基本上就像if (child state) child.html else parent.html
  • 不,我是说如果你想覆盖你父母的模板,你应该将模板设置为状态,而不是视图。请记住,状态模板已加载到根 ui 视图中。我现在在手机上,所以很难提供示例代码,但是请用您的疑问更新您的问题,我稍后会回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多