具有$ http请求的材质角度无限滚动

时间:2015-11-17 14:16:44

标签: javascript angularjs angular-material

我正在使用md-virtual-repeat的{​​{1}}指令进行无限滚动,我需要用$ http请求替换它的demo $ timeout函数。但我无法找到正确的解决方案。 在下面的代码中,无限滚动工作正常,但不显示来自http请求的数据。问题是我不知道将$ http结果绑定到 infiniteItems 的方式。

Here是掠夺者。

的index.html

Angular Material

JS

<body ng-app="infiniteScrolling" class="virtualRepeatdemoInfiniteScroll">
<div ng-controller="AppCtrl as ctrl" ng-cloak>
    <md-content layout="column">
        <md-virtual-repeat-container id="vertical-container" flex>
            <div md-virtual-repeat="item in ctrl.infiniteItems" md-on-demand
                 class="repeated-item" flex>
                {{item.id}}
            </div>
        </md-virtual-repeat-container>
    </md-content>
</div>
</body>

3 个答案:

答案 0 :(得分:11)

这个有效:

plnkr

  • getItemAtIndex返回索引而不是项目
  • 如果你检查过你所推动的东西,你会在我的傻瓜第33行看到我联合obj.data,而不是obj
(function () {
    'use strict';
    angular.module('infiniteScrolling', ['ngMaterial'])
      .controller('AppCtrl', function ($scope, $http) {
          // In this example, we set up our model using a plain object.
          // Using a class works too. All that matters is that we implement
          // getItemAtIndex and getLength.
          var vm = this;
          vm.infiniteItems = {
              numLoaded_: 0,
              toLoad_: 0,
              items: [],

              // Required.
              getItemAtIndex: function (index) {
                  if (index > this.numLoaded_) {
                      this.fetchMoreItems_(index);
                      return null;
                  }
                  return this.items[index];
              },

              // Required.
              getLength: function () {
                  return this.numLoaded_ + 5;
              },

              fetchMoreItems_: function (index) {
                  if (this.toLoad_ < index) {
                      this.toLoad_ += 5;
                      $http.get('items.json').then(angular.bind(this, function (obj) {
                          this.items = this.items.concat(obj.data);
                          this.numLoaded_ = this.toLoad_;
                      }));
                  }
              }
          }
      })
})();

答案 1 :(得分:0)

在每次api调用时尝试获取数据库是否有更多记录。 并在fetchMoreItems_函数中添加该条件。

svg.append("path")
   .attr("class", "path1")
   .datum(data.paths.path1)
   .attr("d", function(d) { return d.path});

在我们的代码中,我们得到了像

这样的详细信息
  • sCurrentPage:3
  • sMore:true ==&gt;&gt;这表示db之后有更多记录                   获取页面数据。
  • sTotalPages:4
  • sTotalRecords:36

答案 2 :(得分:0)

来到这里,看到@ alessandro-buggin的回答非常有帮助。 我不得不稍微改变一下,所以我想分享给别人帮忙。我需要:

  • 以避免在已经恢复数据的同时获取滚动请求(使用this.hold
  • 在从后端收到整个数据时停止请求(使用this.stop_
  • 加载时隐藏内容,以避免毛刺或空元素(再次使用this.hold)。在视图上,您​​需要在该元素上使用ng-hide,因为ng-if避免元素永远存在,因此它不会在第一次加载。
  • 实现刷新方法,以便在从外部表单更改参数/过滤器时重新加载数据。

远非完美,但效果很好。

vm.elements = null;
vm.infiniteItems = { // Start of infinte logic

stop_: false,
hold: false,
numLoaded_: 0,
toLoad_: 0,
items: [],

refresh: function() {
    this.stop_ = false;
    this.hold = false;
    this.numLoaded_ = 0;
    this.toLoad_ = 0;
    this.items = [];
},

getItemAtIndex: function (index) {
    if (!this.hold) {
        if (index > this.numLoaded_) {
            this.fetchMoreItems_(index);
            return null;
        }
    }
    return this.items[index];
},

getLength: function () {
    if (this.stop_) {
        return this.items.length;
    }
    return this.numLoaded_ + 5;
},

fetchMoreItems_: function (index) {
    if (this.toLoad_ < index) {

        this.hold = true;
        this.toLoad_ += 5;

        var start = this.numLoaded_;
        if (start > 0) start++;

        MyService.getData(parameters)
         .then(angular.bind(this, function (obj) {

          if (obj && obj.elements > 0) {
            vm.elements = obj.elements;
            this.items = this.items.concat(obj.data);

            if (obj.elements < this.toLoad_) {
                this.stop_ = true;
            }
            this.numLoaded_ = this.items.length;
            this.hold = false;

          } else { // if no data
            vm.elements = 0;
          }
        }));
    }
}

} // End of infinte logic

注意:我的服务返回一个如下组成的对象: obj = {elements: INTEGER, data: ARRAY}其中,元素告诉您完整查询的长度。