angularjs – 为什么我的观察者会在同一个变化中被叫两次?

前端之家收集整理的这篇文章主要介绍了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调用,其中最初是为了加载页面.>还有一种情况是您在标记中分配了两次控制器.

猜你在找的Angularjs相关文章