Angular show / hide仅在第二个函数调用,apply / digest问题上工作?

时间:2016-01-11 15:36:34

标签: javascript angularjs ionic-framework ionic

我在控制器中有以下内容,它旨在显示加载后的内容。理论上应该是非常简单但不打球,所以我试图理解我做错了什么。这是一个包含离子滑动盒的视图,这是我在加载数据之前试图隐藏的视图,以及用于拉动刷新的离子刷新器,因此$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()。我的错误在哪里?

编辑:所以我刚刚在其中一个幻灯片框项目中添加了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-hide值并且没有第二次函数调用就显示出来......肯定有一个 angular 的原因将指令添加到嵌套项目中隐藏的幻灯片盒可以使用吗?

2 个答案:

答案 0 :(得分:0)

如果你在视图上使用$ scope.data.week,你应该初始化它,否则在第一次调用后,angular不会创建$ watch。

做吧。

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

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

答案 1 :(得分:0)

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

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();