angularjs – 为什么我的观察者会在同一个变化中被叫两次?
我有一个在本地运行的AngularJS 1.4 *应用程序.此应用程序由Laravel 5.1后端RESTFul API提供.
我必须制作代表包旅行的这个应用程序.包裹由天组成,范围从0到N天.每天都有一系列服务,范围从0到N服务.还有一家酒店. 我的laravel应用程序从中获取的Web服务器为我提供了一个预先设置的包,其中包含一个日期列表:每个包含服务列表和酒店数据(到目前为止未使用过).在响应中,我有一个包的属性列表(现在无关紧要)和一个天数组,称为days_info.该响应被放在我的PackageController上的$scope.package中. PackageController还声明了一个名为packageBlock的指令,该指令包含天数列表以及包的其他一些数据. <div ng-repeat="day in package.days_info" class='row'> <div class='col-md-12'> <package-days-block></package-days-block> </div> </div> 内部< package-days-block>指令,我有另一个在每天内遍历服务列表. <div class='container-fluid' ng-repeat='service in day.services' ng-controller="ServiceController"> <service-block></service-block> </div> 这就是问题开始的地方:对于我的不支持,我现在在ServiceController中有一个$scope.service.所以,我开始通过$scope.service在ServiceController中根据我的需要更改它. $scope.service有一个名为service_id的属性.我把一个监听器/观察器放在上面,所以在任何时候更改了$scope.service.service_id,我要求另一个service_table(保存有关服务的信息,它基于之前由用户选择或更改的service_id),并将其放在$scope.service.table中. // ServiceController $scope.reloadServicesTable = function(service_id,service_day,date,paxes){ MandatoryService.getServiceTable(service_id,paxes) .then( function(service_data) { $scope.service.table = service_data; },... ); 在观察程序上调用reloadServicesTable以进行service_id更改. // ServiceController $scope.$watch( 'service.service_id',// Places the watcher to watch the changes on the service's ID. function(new_service,old_service) { if( new_service === old_service ) return; $scope.reloadServicesTable($scope.service.service_id,$scope.service.service_day,$scope.day.date,$scope.package.paxes); } ); 问题从这里开始:当service_id只更改一次时,将调用服务表的请求两次. 上帝啊,这到底是为什么?! 我的代码的另一部分是,我从PackageController运行整个days_info数组,并在service.table:service.table.price中读取属性价格的值.在那里,我意识到有两个范围:我处理的一个范围,另一个范围我没有它来自哪个FREAKING IDEA! 如果我放一个console.log($scope);在遍历days_info的方法内部,我为每个请求获得两个范围.这个方法在PackageController上. 任何想法为什么会这样? P.S.:这是我的第一个AngularJS应用程序,所以,如果我搞砸了一些基本的东西,那就太容易了…… 编辑: 正如一位评论员所指出的,我的问题不是很可重复.可悲的是,我不能只把我怀疑的部分放在这里,因为我没有任何想法,问题所在! (我知道这没有多大帮助) 我从Chrome控制台拍摄了一些屏幕截图: 首先,请求触发了service_id的更改 如您所见,每次请求都会被调用两次.这不是一次性的事情. / api / service / {id} …是对服务表信息的调用. / api / service / by_route / origin / …返回从一个城市到另一个城市(或相同)的服务列表.一个不干涉另一个. 另一个图像是来自PackageController $scope的console.log的输出,在service_id被更改时. 如您所见,有两个不同的范围.并且b范围是范围的儿子. r范围也在调用service_id上??的观察者? 对于总和价格的调用是从不同的地方调用两次,如下图所示:
它可以解决你的问题.即使我面对的也和你提到的完全一样.
>我的原因是,控制器再次初始化,并且有一个单独的api调用,其中最初是为了加载页面.>还有一种情况是您在标记中分配了两次控制器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |