我尝试实现此处记录的无限滚动:https://material.angularjs.org/latest/demo/virtualRepeat
但是,我发现的所有示例都使用$ http.get来请求外部.json文档。我想使用存储在控制器中另一个函数检索的作用域中的现有JSON数组。为了简化测试目的,我创建了一个只执行基础知识的plunkr。
以下是我使用外部.json文件找到的工作示例:http://plnkr.co/edit/e32qVQ4ECZBleWq2Gb2O?p=preview
我需要做的就是用$ scope.items替换$ http.get请求代码,但我的尝试失败了。以下是我修改过的示例:http://plnkr.co/edit/S2k6pxJ2mZ7MQsILnmvS?p=preview
(function () {
'use strict';
angular
.module('infiniteScrolling', ['ngMaterial'])
.controller('AppCtrl', function ($timeout,$scope) {
$scope.items = [
{
"categoryId": "cat1",
"id": "pack0"
},
{
"categoryId": "cat1",
"id": "pack8"
},
{
"categoryId": "cat1",
"id": "pack9"
},
{
"categoryId": "cat1",
"id": "pack10"
},
{
"categoryId": "cat1",
"id": "pack11"
}
];
// 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,
// Required.
getItemAtIndex: function (index) {
if (index > this.numLoaded_) {
this.fetchMoreItems_();
return null;
}
return this.items[index];
},
// Required.
getLength: function () {
return this.numLoaded_ + 5;
},
fetchMoreItems_: function ($scope, index) {
if (this.toLoad_ < index) {
this.toLoad_ += 5;
$scope.items.then(angular.bind(this, function (obj) {
this.items = this.items.concat(obj.data);
this.numLoaded_ = this.toLoad_;
}));
}
}
};
});
})();
答案 0 :(得分:0)
http://plnkr.co/edit/GUvhluPx3bS2XUSjFHvN?p=preview
由于您尝试替换返回承诺的$http.get
调用,您只需将其替换为$timeout
(因为这也会返回一个承诺并触发$apply
)。只有其他警告才是$ timeout返回的对象没有数据属性(这只是httppromise的一个特性,因为它具有http状态等)所以我不得不将obj.data
更改为{{1 }}