我已经使用有角的ui bootsrap创建了一个轮播。由于加载了很多图像(超过1,000张),因此我使用了一个滤镜在分页中显示500张图片。
.filter('pages', function () { return function (input, currentPage, pageSize) { if (angular.isArray(input)) { var start = (currentPage - 1) * pageSize; var end = currentPage * pageSize; return input.slice(start, end); } }; })
控制器:
self.currentPage = 1; self.itemsPerPage = 500; self.maxSize = 10; //imagesUrls is response.data from http call angular.forEach(imagesUrls, function (parent) { var date = uibDateParser.parse(parent.fileCreationTime, 'M/d/yyyy hh:mm:ss a'); // fill our slide arrays with urls // model update here self.slides.push({ image: parent.fileName, time: date, id: parent.id }); }); self.totalItems = self.slides.length;
我这样使用它:
<div uib-carousel active="$ctrl.active" interval="$ctrl.myInterval" no-wrap="$ctrl.noWrapSlides" no-pause="true"> <div uib-slide ng-repeat="slide in $ctrl.slides | pages: $ctrl.currentPage : $ctrl.itemsPerPage track by $index" index="$index"> <img id="carousel-img" ng-src="{{slide.image}}"> <div class="carousel-caption"> <p>Index {{$index}}</p> </div> </div> </div> <div class="row"> <ul uib-pagination total-items="$ctrl.totalItems" items-per-page="$ctrl.itemsPerPage" ng-model="$ctrl.currentPage" max-size="$ctrl.maxSize" boundary-link-numbers="true" force-ellipses="true" class="pagination-sm"> </ul> </div>
这按预期工作。
首次加载轮播时,索引为0。当移至下一张幻灯片时,索引为1;当移至下一张幻灯片时,索引为2。当显示当前图像的slide.id时,索引也为2。 2。
问题:
但是,当您单击第二个分页链接时,索引不会回到零,而是从幻灯片在轮播中的最后一个索引开始。
所以现在索引是2,当前图像的幻灯片ID是502。
如果滑动到索引20,然后单击分页链接,索引仍为20。当您显示当前图像的幻灯片ID时,它将变为520。
有没有办法使索引再次从0开始,所以slide.id是500,而不是502或520?
希望我的问题清楚。
避免track by $index在使用唯一的属性标识符时使用。当使用所有唯一的对象时(例如这种情况),最好让其ng- repeat使用自己的跟踪而不是使用进行覆盖track by $index。
track by $index
ng- repeat
<div uib-slide ng-repeat="slide in $ctrl.slides | pages: $ctrl.currentPage : $ctrl.itemsPerPage track by ̶$̶i̶n̶d̶e̶x̶ slide.id" index="$index"> <img id="{{slide.id}}" ng-src="{{slide.image}}"> <div class="carousel-caption"> <p>Index {{ ̶$̶i̶n̶d̶e̶x̶ slide.id}}</p> </div> </div>
从文档中:
如果要使用具有唯一标识符属性的对象,则应按此标识符而不是对象实例进行跟踪。如果以后要重新加载数据,ngRepeat则不必为已呈现的项目重建DOM元素,即使该集合中的JavaScript对象已替换为新的DOM元素也是如此。对于大型集合,这可以显着提高渲染性能。 — AngularJS ng-repeat指令API参考- 跟踪
如果要使用具有唯一标识符属性的对象,则应按此标识符而不是对象实例进行跟踪。如果以后要重新加载数据,ngRepeat则不必为已呈现的项目重建DOM元素,即使该集合中的JavaScript对象已替换为新的DOM元素也是如此。对于大型集合,这可以显着提高渲染性能。
ngRepeat
— AngularJS ng-repeat指令API参考- 跟踪
angular.module("app",['ngAnimate', 'ngSanitize', 'ui.bootstrap']) .controller("ctrl", function(uibDateParser) { var self = this; self.currentPage = 1; self.itemsPerPage = 10; self.maxSize = 10; var url = '//unsplash.it/200/100'; var imagesUrls = []; for (let i=0; i<40; i++) { var slide = { fileName: url+"?image="+(1000+i), id: 'id'+(0+i+100), fileCreationTime: new Date() } imagesUrls.push(slide); } self.slides = []; //imagesUrls is response.data from http call angular.forEach(imagesUrls, function (parent) { var date = uibDateParser.parse(parent.fileCreationTime, 'M/d/yyyy hh:mm:ss a'); // fill our slide arrays with urls // model update here self.slides.push({ image: parent.fileName, time: date, id: parent.id }); }); //console.log(self.slides); self.totalItems = self.slides.length; }) .filter('pages', function () { return function (input, currentPage, pageSize) { if (angular.isArray(input)) { var start = (currentPage - 1) * pageSize; var end = currentPage * pageSize; return input.slice(start, end); } }; }) <script src="//unpkg.com/angular/angular.js"></script> <script src="//unpkg.com/angular-animate/angular-animate.js"></script> <script src="//unpkg.com/angular-sanitize/angular-sanitize.js"></script> <script src="//unpkg.com/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js"></script> <link href="//unpkg.com/bootstrap/dist/css/bootstrap.css" rel="stylesheet"> <body ng-app="app" ng-controller="ctrl as $ctrl"> <div class="container" uib-carousel active="$ctrl.active" interval="$ctrl.myInterval" no-wrap="$ctrl.noWrapSlides" no-pause="true"> <div uib-slide ng-repeat="slide in $ctrl.slides | pages: $ctrl.currentPage : $ctrl.itemsPerPage track by slide.id" index="$index"> <img id="{{slide.id}}" ng-src="{{slide.image}}"> <div class="carousel-caption"> <p>Index {{slide.id}}</p> </div> </div> </div> <div class="row container"> <ul uib-pagination total-items="$ctrl.totalItems" items-per-page="$ctrl.itemsPerPage" ng-model="$ctrl.currentPage" max-size="$ctrl.maxSize" boundary-link-numbers="true" force-ellipses="true" class="pagination-sm"> </ul> </div> </body>