角度显示/隐藏只处理第二个函数调用,应用/摘要问题

Angular show/hide working only on second function call, apply/digest issue?

本文关键字:应用 函数调用 问题 处理 显示 隐藏 第二个      更新时间:2023-09-26

我在一个控制器中有以下内容,该控制器旨在显示加载后的内容。理论上应该很简单,但不是打球,所以我试图理解我做错了什么。这是一个包含离子滑动框的视图,这是我试图隐藏的,直到数据加载,并带有一个离子刷新器,用于拉动刷新,因此$scope.broadcast('scroll.refreshComplete');

    //initial controller vars:
    $scope.data = {};
    $scope.data.loading = true;
    $scope.data.user = 1;
    $scope.data.week = {};
    $scope.data.getContent = function() {
            var now = new Date().getTime();
            serverRequestFactory.getWeek(now)
            .success(function(response){
                    $scope.data.week = response;
                    $scope.data.loading = false;
                    $ionicSlideBoxDelegate.update();
                    $scope.$broadcast('scroll.refreshComplete');
                    })
            .error(function(response){
                   $scope.data.loading = false;
                   $scope.$broadcast('scroll.refreshComplete');
                   })
            }
            if($scope.data.user == 1){
            //calls above on view load
                $scope.data.getContent();
                //$scope.data.getContent();
            }

奇怪的是,如果我取消对$scope.data.getContent()的第二个调用的注释,那么上面的操作就可以了,但我不知道为什么。在设置$scope.data.week对象和更新幻灯片框委托之前和之后,我都尝试过$scope.apply()。我的错误在哪里?

EDIT:所以我刚刚在其中一个幻灯片框项目中添加了一个ng repeat指令:

<ion-slide-box on-slide-changed="slideHasChanged($index)" ng-hide="data.loading">
            <ion-slide class="customSlidePadding" ng-repeat="item in data.week.items"> 

现在,整个幻灯片框都遵循初始ng隐藏值,并且在没有第二个函数调用的情况下显示。。。肯定有一个角度的原因,将指令添加到隐藏幻灯片框中的嵌套项会起作用吗?

如果您在视图中使用$scope.data.week,则应该对其进行初始化,否则angular在第一次调用后不会对其创建$watch。

就这么做吧。

$scope.data.week = []; //or whatever data you want...

您应该在调用异步请求之前执行此操作。

除非您的模板实际上是通过事件处理程序调用您的函数

on-event="data.getContent()"

或者通过某种结合机制(我不推荐)

<p>{{data.getContent()}}

那么你实际上并没有调用这个方法。我在提供的代码中没有看到任何实际调用它的内容,您只定义了在if块中调用自己的方法。

尝试明确地调用它:

$scope.data.getContent = function() {
        var now = new Date().getTime();
        serverRequestFactory.getWeek(now)
        .success(function(response){
                $scope.data.week = response;
                $scope.data.loading = false;
                $ionicSlideBoxDelegate.update();
                $scope.$broadcast('scroll.refreshComplete');
                })
        .error(function(response){
               $scope.data.loading = false;
               $scope.$broadcast('scroll.refreshComplete');
               })
        }
        if($scope.data.user == 1){
        //calls above on view load
            $scope.data.getContent();
            //$scope.data.getContent();
        }
}
//explicitly calling
$scope.data.getContent();