Onsen Ui无限滚动+ AngularJS ng Show

时间:2014-09-21 21:28:27

标签: angularjs onsen-ui angularjs-ng-show

我试图在无限滚动加载更多列表项时显示加载块,并且第一次确定它,但以下情况确实有效。当" $ scope.isLoading = true;"该块不可见。

HTML

<ons-scroller infinit-scroll-enable="true" on-scrolled="getNextItems()" threshold="20" style="height:100%">
    <ons-list-item  ng-repeat="i in items" modifier="tappable chevron">{{i.name}}</ons-list-item>

    <ons-list-item ng-show="isLoading"> LOADING </ons-list-item>

</ons-scroller>

JAVASCRIPT

  $scope.getNextItems = function(){
    if($scope.isLoading) return;
    $scope.isLoading = true;
      setTimeout(function(){
          $scope.$apply(function(){
              addItems($scope.items);
              $scope.isLoading = false;
          });
      },3000);
  };

这是问题的小提琴。

http://jsfiddle.net/mh6roxsk/

我尝试了不同的方法来做到这一点,但总是有相同的结果。

提前致谢!!


正如@rohan回答问题是用$ timeout解决的,我想要的行为是这样的:

http://jsfiddle.net/hasukronos/mh6roxsk/1/

但是我忘了提到真正的问题发生在WebSQL api回调上,它与本机setTimeout有同样的问题。

1 个答案:

答案 0 :(得分:2)

似乎onsen-ui库没有使用$ apply块调用你在滚动内部提供的方法,但它是在文档的初始渲染期间第一次调用,这就是它工作的原因第一次。

因此,角度第一次被告知你的变量发生了变化,但从那以后就没有了。

$scope.getNextItems = function(){
  if($scope.isLoading) return;

   $timeout(function(){
       addItems($scope.items);
       $scope.isLoading = false;
   },3000);

   $timeout(function() {
     $scope.isLoading = true;  
   });
};

您的代码已经进行了两处更改。

  1. setTimeout已更改为$ timeout,最重要的是默认情况下$ timeout会在$ apply块中执行您的代码。

  2. 第二个$ timeout用于通知角度$ scope变量 正在改变,通常你不应该这样做(图书馆应该这样做)。原因是它包含在$ timeout调用中是因为第一次手动调用getNextItems并在摘要周期中调用$ apply会产生错误。