Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度-在同一视图/路由/页面中解析多个控制器_Angularjs_Angularjs Scope - Fatal编程技术网

Angularjs 角度-在同一视图/路由/页面中解析多个控制器

Angularjs 角度-在同一视图/路由/页面中解析多个控制器,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我们正在构建一个大型SPA,目前该应用程序是使用小部件/组件构建的。每个都有一个模板、控制器。但许多可以嵌套在同一路线中。例如:在路由/users/中,我可以有一个`userCtrl和一个userTemplate来呈现用户统计信息部分。一个graphCtrl和一个graphTemplate来渲染一些d3图形。用于呈现列表的listCtrl和listmodel。所有这些小部件都应该是可重用的(使用不同的css和布局,有时在其他页面中使用相同的ctrl和不同的模板)。我需要实例化一个服务中的一些数据

我们正在构建一个大型SPA,目前该应用程序是使用
小部件/组件构建的。每个都有一个模板、控制器。但许多可以嵌套在同一路线中。例如:在路由
/users/
中,我可以有一个
`userCtrl
和一个
userTemplate
来呈现用户统计信息部分。一个
graphCtrl
和一个
graphTemplate
来渲染一些d3图形。用于呈现列表的
listCtrl
listmodel
。所有这些小部件都应该是可重用的(使用不同的css和布局,有时在其他页面中使用相同的ctrl和不同的模板)。我需要实例化一个服务中的一些数据——比如说一个返回我的用户id和更多验证的服务。因此,在主应用程序路由中,我为
userCtrl
定义了
when
路由提供程序的
when
子句路由到的
解析{myId:function(srvname){return srvname.myId}

我的问题是
listCtrl
没有等待
userCtrl
(获取路由的
main
页面ctrl)来解决不同的承诺,然后由于缺少数据而失败

有没有办法为多个控制器定义相同的解决方案,其中一些控制器不是直接路由目标,而是更大的组件?有没有更好/更聪明的方法

我知道我可以使用指令。但是,将业务逻辑从
listCtrl
移动到指令看起来显然是错误的


我很乐意得到任何帮助和建议

控制器之间通信的标准建议是使用服务。如果我读对了您的描述,那么在您的情况下,顶级控制器将负责设置模型,并在服务中设置模型,以便“后代”控制器阅读

编辑@alonisser的评论:

您应该能够将依赖控制器的视图数据绑定到依赖$scope(比如
viewData()
上的函数,如果函数返回null,元素将隐藏或显示“微调器”UI

依赖模板的外观类似于:

...
<div data-ng-if="viewData() !== null">
    <!-- show display elements based on the return value from viewData() -->
</div>
...
something_that_returns_a_promise.then(function (result) {
    $scope.model.asyncData = result;
});
userCtrl中的异步调用类似于:

...
<div data-ng-if="viewData() !== null">
    <!-- show display elements based on the return value from viewData() -->
</div>
...
something_that_returns_a_promise.then(function (result) {
    $scope.model.asyncData = result;
});

一个关键问题是,返回的
某物\u A\u promise()
必须是AngularJS调用堆栈的“内部”某物,例如,使用
$http
。在这种情况下,Angular会自动调用
$scope.$apply()
,您的相关显示元素应该无缝更新。否则,您将需要调用
$scope.$apply()
在设置
$scope.model.asyncData

的异步回调中,控制器之间通信的标准建议是使用服务。如果我正确阅读了您的描述,那么在您的情况下,顶级控制器将负责设置模型,并在“子代”的服务中设置模型要读取的控制器

编辑@alonisser的评论:

您应该能够将依赖控制器的视图数据绑定到依赖$scope(比如
viewData()
上的函数,如果函数返回null,元素将隐藏或显示“微调器”UI

依赖模板的外观类似于:

...
<div data-ng-if="viewData() !== null">
    <!-- show display elements based on the return value from viewData() -->
</div>
...
something_that_returns_a_promise.then(function (result) {
    $scope.model.asyncData = result;
});
userCtrl中的异步调用类似于:

...
<div data-ng-if="viewData() !== null">
    <!-- show display elements based on the return value from viewData() -->
</div>
...
something_that_returns_a_promise.then(function (result) {
    $scope.model.asyncData = result;
});

一个关键问题是,返回的
某物\u A\u promise()
必须是AngularJS调用堆栈的“内部”某物,例如,使用
$http
。在这种情况下,Angular会自动调用
$scope.$apply()
,您的相关显示元素应该无缝更新。否则,您将需要调用
$scope.$apply()
您自己在设置
$scope.model.asyncData

的异步回调中,谢谢@david pope,但我认为您没有抓住要点,顶级控制器确实设置了模型。但是由于异步操作涉及到其他控制器,因此其他控制器不会等待它并失败。“解析”可以解决问题,但是控制器只需运行而不必等待顶级
控制器解析。有没有办法强迫它们解析?谢谢@david pope,但我认为您没有抓住要点,顶级控制器确实设置了模型。但是由于涉及的异步操作,其他控制器不必等待,而只是失败。“解析”将完成此操作k、 但是控制器只是在不等待顶级控制器解析的情况下运行?