当前位置: 首页 > 面试题库 >

父视图中的控制器无法通过子视图访问

鲜于海
2023-03-14
问题内容

我为其中一个页面设置了一个版式,然后使用大量的小视图作为种子,这些小视图用于填充日期。我的状态目前看起来像这样:

  .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'
      }
    }
  })

如您所见,父布局将我的Controller保留在称为 EventCtrl
的页面上。现在,我希望所有视图现在都可以访问此控制器,但事实并非如此。相反,我必须将来自 eventLayout
的主要父模板包装到div中,然后在其中使用旧学校:

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

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

编辑:

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

从父$ state eventLayout中的* partials / layouts / event.html 文件中 *

<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路由器设计都是关于 view / $ scope 继承的,而不是基本控制器的可访问性。详细信息可以在这里找到:

[仅按视图层次结构的作用域继承](https://github.com/angular-ui/ui-router/wiki/Nested-

States-%26-Nested-Views#scope-inheritance-by-view-hierarchy-only)

小引用:

请记住,如果状态的视图是嵌套的,则范围属性仅沿状态链继承。 范围的遗传 特性 无关 做到与 你的国家的嵌套一切
与你的看法嵌套 (模板)。

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

另外,这些都是不错的阅读材料,在这里几乎无法更好地解释这些内容:

  • Minko Gechev编写的AngularJS继承模式
  • AngularJS –第3部分, Gabriel Schenker的继承

因此,让我们总结一下。

1)我们知道,从任何模板中,我们只能访问其自己的$scope
2)在视图/模板$ scope中可用的是它的一项工作Controller,可以通过一些功能,对象等对其进行扩展
。3)如果有任何父控制器 (从嵌套视图的角度) 将任何东西注入到自己的/父范围-我们也可以访问它 (所谓的原型继承)

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

// 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>

另一种技术是将控制器放入$ scope的Events对象中:

$scope.Events = this; // controller

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



 类似资料:
  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 在iOS6中,我注意到了新的容器视图,但不太确定如何从包含视图访问它的控制器。 脚本: 我想从包含容器视图的视图控制器访问Alert view controller中的标签。 他们之间有一段距离,我能用吗?

  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 以下的一段代码相当于定义一个ParameterizableViewController视图控制器的快捷方式,该控制器会立即将一个请求转发(forwards)给一个视图。请确保仅在以下情景下才使用这个类:当控制器除了将视图渲染到响应中外不需要执行任何逻辑时。 以下是一个例子,展示了如何在MVC Java编程配置方式下将所有"/"请求直接转发给名字为"home"的视图: @Configuration

  • 本文向大家介绍iOS 访问容器视图控制器,包括了iOS 访问容器视图控制器的使用技巧和注意事项,需要的朋友参考一下 示例 当视图控制器出现在标签栏控制器中时,您可以像这样访问标签栏控制器: 迅速 目标C 当视图控制器是导航堆栈中的一部分时,您可以按以下方式访问导航控制器: 迅速 目标C