2014-09-08 11 views
15

mia abitudine startFrom filtro mi sta dando un errore.Filtro personalizzato dare "Impossibile leggere la proprietà 'fetta' di non definito" in AngularJS

app.filter('startFrom', function() { 
    return function(input, start) { 
     start = +start; //parse to int 
     return input.slice(start); 
    } 
}); 

app.controller("PostCtrl", function($scope, $http) { 
$scope.currentPage = 0; 
$scope.pageSize = 10; 
$scope.hidePagination = true; 

$scope.search = function() { 
    $http.get('someurl').then(sucesscalback,errorcalback); 
    function sucesscalback(response) 
    { 
     $scope.hidePagination = false; 
     console.log("Success:"); 
     console.log(response.data.records); 
     $scope.posts = response.data; 
     $scope.numberOfPages=Math.ceil($scope.posts.records.length/$scope.pageSize); 
     alert($scope.numberOfPages); 
    } 
    function errorcalback(failure) 
    { 
     console.log("Error:"); 
     console.log(failure); 
    } 

risposta

46

Il filtro deve verificare se esiste o meno l'ingresso:

app.filter('startFrom', function() { 
    return function(input, start) { 
     if (!input || !input.length) { return; } 
     start = +start; //parse to int 
     return input.slice(start); 
    } 
}); 

caso contrario, la funzione di filtro viene eseguito e chiamare slice su undefined che non ha una proprietà di slice come un tal array o stringa.

Il motivo del filtro viene chiamato mentre non v'è alcun valore perché il filtro verrà eseguito quando angolare esegue il suo primo ciclo $digest. È possibile evitare l'errore aggiungendo un valore iniziale nel controller, ma è preferibile aggiungere semplicemente l'istruzione if al filtro.

Here's a demo of both solutions. Avviso non ci sono errori.

+1

sì. ma perché l'input non è definito/non esiste? – Fahad

+3

@Fahad perché un ciclo di $ digest angolare viene eseguito prima che il valore venga popolato dal controller. – m59

+0

oh sì ... c'è qualche soluzione? – Fahad