Angularjs 子视图无法访问父布局中的控制器

Angularjs 子视图无法访问父布局中的控制器,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我为我的一个页面设置了一个布局,然后用一大堆小视图作为种子,我用这些视图填充日期。我的州目前看起来是这样的: .state('eventLayout', { templateUrl: 'partials/layouts/event.html', controller: 'EventCtrl', }) .state('event', { parent: 'eventLayout', url: '/event/{eventUrl}', views:

我为我的一个页面设置了一个布局,然后用一大堆小视图作为种子,我用这些视图填充日期。我的州目前看起来是这样的:

  .state('eventLayout', {
    templateUrl: 'partials/layouts/event.html',
    controller: 'EventCtrl',
  })
  .state('event', {
    parent: 'eventLayout',
    url: '/event/{eventUrl}',
    views: {
      'event.video': {
        templateUrl: 'partials/views/event.video.html'
      },
      'event.info': {
        templateUrl: 'partials/views/event.info.html'
      },
      'card.event': {
        templateUrl: 'partials/views/card.event.html'
      },
      'card.clip': {
        templateUrl: 'partials/views/card.clip.html'
      },
      'card.upcoming': {
        templateUrl: 'partials/views/card.upcoming.html'
      },
      'card.banner': {
        templateUrl: 'partials/views/card.banner.html'
      },
      'card.comment': {
        templateUrl: 'partials/views/card.comment.html'
      },
      'card.notification': {
        templateUrl: 'partials/views/card.notification.html'
      },
      'card.cube': {
        templateUrl: 'partials/views/card.cube.html'
      },
      'card.mix': {
        templateUrl: 'partials/views/card.mix.html'
      },
      'card.score': {
        templateUrl: 'partials/views/card.score.html'
      },
      'card.sponsor': {
        templateUrl: 'partials/views/card.sponsor.html'
      },
      'card.nobroadcasters': {
        templateUrl: 'partials/views/card.nobroadcasters.html'
      },
      'card.link': {
        templateUrl: 'partials/views/card.link.html'
      },
      'card.suggest': {
        templateUrl: 'partials/views/card.suggest.html',
        controller: 'SuggestblockCtrl'
      },
      'card.footer': {
        templateUrl: 'partials/views/card.footer.html'
      }
    }
  })
正如您所看到的,父布局为名为EventCtrl的页面保存我的控制器。现在我希望所有视图现在都可以访问这个控制器,但事实似乎并非如此。相反,我必须将eventLayout中的主父模板包装在一个div中,然后使用旧的方法:

 <div ng-controller="EventCtrl"></div>

我想至少了解为什么会发生这种情况,以及确保所有视图都可以访问主控制器的正确方法。谢谢

编辑:

要为我如何使用当前应用程序中的视图添加更多上下文,我在下面详细介绍了当前设置

从父$state中的文件partials/layouts/event.htmleventLayout

<div ng-controller="EventCtrl">
<div ui-view="event.video"></div>
  <div ng-repeat="activity in activities.results">
    <div ng-if="activity.card_type == 'event'" ui-view="card.event"></div>
    <div ng-if="activity.card_type == 'clip'" ui-view="card.clip"></div>
    <div ng-if="activity.card_type == 'upcoming'" ui-view="card.upcoming"></div>
  </div>
</div>
</div>


如您所见,视图嵌套在父布局中。我必须用ng controller=“EventCtrl”将其全部打包,以便允许每个视图访问其范围

angular的整个ui路由器设计是关于视图/$scope继承,而不是基本控制器可访问性。详细信息可在此处找到:

小引用:

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

完全可能存在嵌套状态,其模板在站点中的各种非嵌套位置填充ui视图。在这种情况下,您不能期望在子状态的视图中访问父状态视图的范围变量

这些都是很好的读物,这里很难更好地解释这些内容:

  • 明科·格切夫
  • 加布里埃尔·申克
让我们总结一下

1) 我们知道,从任何模板中,我们只能访问它自己的
$scope

2) view/template$scope中提供的是其
控制器的作业,该控制器可以使用一些函数、对象等对其进行扩展。
3) 如果任何父控制器(从视图嵌套的角度)将任何东西注入到它自己的/父范围中,那么我们也可以访问它(所谓的原型继承)

这样,我们就可以在父$scope中创建一个由
EventCtrl
管理的
Events
对象,并在任何子视图模板中使用它:

// the reference (reference to object Events) 
// to be shared accross all child $scopes
$scope.Events = {};

// objects
$scope.Events.MyModel = { FirstName: "....

// functions
$scope.Events.save = function () {....
现在在任何子模板中,我们都可以这样使用它

<div>{{Events.MyModel.FirstName}}</div>

然后可以完全访问控制器的方法、属性…

I稍微多了解一些上下文会有所帮助。你能给我们举个例子,说明你是如何实现子视图的,以及你用来访问父数据的方法吗?回答得很好,Radim。UI路由器体系结构可能会让那些来自普通老式AngularNG控制器风格的人感到困惑。这个概述非常简洁明了。@radim-köhler我想我明白了(尽管我还需要再读几遍)。对我来说,奇怪的问题是,从
中eventLayout的父状态包装我的整个event.html允许我访问控制器中的所有作用域。在我的大脑里,把控制器连接到我上面的例子中的状态,基本上应该做同样的事情。鉴于我对您所说内容的理解,我的exmaple显示了一个没有嵌套视图的父视图和一个有多个嵌套视图的子视图。然后,我可以将控件放在子状态上吗?@RadimKöhler作为另一个后续步骤,我编辑了我的示例,以进一步展示如何使用它。有了这个用例,如果我将控制器附加到父状态,我是否应该能够从任何视图检索从控制器创建的作用域?@Mr.BigglesWorth,我真的不确定您试图实现什么。也许你应该首先阅读更多关于UI路由器的内容,以了解你能得到什么。大多数情况下,多视图和嵌套状态是如何为您工作的。在这里,我把所有重要的链接放在一起。此外,我还创作了一些作品,展示了我上面所描述的,而我真的不知道你在做什么;(没关系,再次谢谢你!
$scope.Events = this; // controller