2016-04-12 10 views
0

İşte kodlar.AngularJS özel filtresi iki kez çağrıldı ve ikinci aramada giriş verilerini sil

var app = angular.module("nameApp", ["ngRoute"]); 

app.controller("ctrlname", function ($scope, $http, $filter, apiKey, apiUrl) { 
    $scope.data = {}; 
    $scope.currentPage = 1; 
    $scope.pageSize = 5; 
}); 

$ scope.data, bir HTTP GET isteğinden bir dizi veri içerecektir. Aşağıda, sonuçların sayfalandırılması amacıyla özel bir filtre kodu verilmiştir. Temel olarak, bu, sonuçları yalnızca 5 ile sınırlayacaktır. Sayfalandırma düğmelerinin $ scope.currentPage değerini güncelleyeceği.

app.filter("limitResults", function ($filter, $log) { 
    return function (data, page, size) { 
     if (angular.isArray(data) & angular.isNumber(page) && angular.isNumber(size)) { 
      var startPage = (page - 1) * size; 
      if (data.length < startPage) { 
       return []; 
      } else { 
       $log.info(data); 
       $log.info(page); 
       $log.info(size); 
       $log.info(startPage); 
       return $filter("limitTo")(data.splice(startPage), size); 
      } 
     } else { 
      return data; 
     } 
    } 
}); 

Verileri işleyen HTML sayfası budur.

<div class="row resultItems" ng-repeat="video in data.videos | limitResults:currentPage:pageSize"> 
    <div class="col-sm-3 testing"> 
     <img ng-src="{{video.snippet.thumbnails.default.url}}"> 
    </div> 
    <div class="col-sm-9 testing"> 
     <h5> 
      {{video.snippet.title}} 
     </h5> 
     <p> 
      {{video.snippet.channelTitle}} 
     </p> 
     <p> 
      {{video.snippet.description}} 
     </p> 
    </div> 
</div> 

Ben filtre uygulandığında gerçekten ne olacağını görmek amacıyla özel filtresinde $ log.info kod birkaç satır koydu. Filtre, normal bir davranış olan iki kez çalışır.

Kafa karıştırıcı bulduğum şey, özel filtre ilk kez çalıştırıldığında, $ log.info (veri) bir HTTP GET çağrısından alınan orijinal verileri konsola kaydeder. Ancak, özel filtre ikinci kez çalıştırıldığında, $ log.info (data), konsola boş bir dizi kaydeder.

"$ log.info (data); $ log.info (sayfa); $ log.info (size);" konsola giriş yapın, ikinci IF ifadesinin (if (data.length < startPage)) DOĞRU ve filtreye (return $ filter ("limitTo")) (data.splice (startPage), boyut) olarak değerlendirildiği açıktır. ;) uygulanır.

Özel filtreye iletilen veriler olan dizinin, filtre ikinci kez çalıştırıldığında neden boşaltılacağını anlamıyorum.

+0

deneyin da 'data.length'' startPage' yapıp. –

+0

Sanırım filtre ifadesini değiştirmeniz gerekiyor. $ filter ("limitTo") döndürün (data, size, startPage); –

cevap

0

Boş diziyi görmenizin nedeni ekleme yöntemidir.

$filter("limitTo")(data.splice(startPage), size); 

deleteCount geçmemiş durumunda gelir ekleme yöntemi, ikinci parametre olarak adlandırılır

array.splice(start, deleteCount[, item1[, item2[, ...]]]) 

ise Splice yöntemi sözdizimi, deleteCount [- başlangıç ​​arr.length] olarak kabul edilecektir. Durumunuzda, ilk kez filtre yürütüldüğünde, dizinin tamamı boş olur. Eğer `[] dönmek` ve ne olduğunu görünce ekleme yöntemi için

See this doc

İlgili konular