【发布时间】:2016-08-23 13:16:36
【问题描述】:
我有一个页面控制器,在这里简化
angular.module('app').controller('MyCtrl', function () {
this.name = 'David'
});
我在我的模板中使用了 controllerAs 语法(MyCtrl 作为 main),所以我只在我的模板中使用 main.name 来访问名称。都很好。
在我的模板中,我有一堆嵌套指令,它们创建了新的作用域,在底部的某处我有一个 ng=controller="SubCtrl as subController"。我现在可以通过 subcontroller.property 访问子控制器上的属性,并且在该模板中我仍然可以访问 main.name 因为 controllerAs 很棒。
问题在于,在我的第二个控制器代码中,我需要访问父控制器中的内容,此时父控制器的深度为 n 级。我知道我可以在主控制器中这样做......
$scope.main = this;
然后在第二个控制器中执行此操作
var main = $scope.$parent.$parent.$parent.$parent.main;
但我们都知道我们不应该这样做,而且我也不知道它有多深,因为我不知道开发人员在其中放置了多少指令来创建新范围。
我听到一些人在谈论为此创建一个服务,但这听起来很难通用,我不希望我的框架的用户每次将包含放入标签面板,那太疯狂了。
所以,我目前的想法是使用作用域并编写一个函数,该函数将遍历父作用域,直到找到您使用比较函数指定的作用域。不过我觉得可能有更好的方法。
【问题讨论】:
-
谁会在不暴露问题的情况下投票否决问题?我认为我解释得很好,这是一个完全有效的问题。
-
那么为什么不创建一个服务呢?服务是存储数据或访问多个控制器、指令、工厂等所需内容的好地方。它基本上是一个单例,你在多个地方注入,但它总是被注入同一个实例。它非常易于使用,并且比您想象的要脆弱得多($parent.$parent.n.....data)。如果您进行单元测试,它也更易于测试。
-
我去过那里,我向您保证,如果您想在控制器之间共享信息,没有什么比服务更好的了。例如:用于存储用户
infoService信息的服务。mainCtrl可以做infoService.registerUser({name : 'David'})然后subCtrl可以做infoService.getLatestUser() -
我不确定我是否理解。我不仅有一个需要从嵌套子控制器访问的控制器,我在所有应用程序中都有它们,它们可以访问不同的父级。我实际上需要访问控制器的方法和数据(控制器中附加到“this”的所有内容),所以我是否需要为我想要执行此操作的每个场景创建一个新服务?我认为它是单例的事实是问题所在?
-
你说得好像它只是一段数据。是的,您仍然应该将共享的业务逻辑抽象到工厂(如果没有状态共享)或服务(如果有状态共享)中,然后在必要时/在必要时将它们注入您的控制器。尽可能保持一切模块化。
标签: javascript angularjs scope angular-controller