2014-09-08 12 views
15

Mój niestandardowy filtr startFrom podaje błąd.Filtr niestandardowy z napisem "Nie można odczytać właściwości" z undefined "w 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); 
    } 

Odpowiedz

46

Twój filtr musi sprawdzić, czy wejście istnieje:

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

przeciwnym razie funkcja filtr będzie działał, a tym samym wywołać slice na undefined który nie posiada właściwości slice jak u tablica lub łańcuch znaków.

Powód, dla którego filtr jest wywoływany, gdy nie ma żadnej wartości, jest taki, że filtr będzie działał, gdy Angular uruchomi pierwszy cykl $digest. Można uniknąć błędu, dodając wartość początkową w kontrolerze, ale najlepiej jest dodać do filtra instrukcję if.

Here's a demo of both solutions. Zauważ, że nie ma błędów.

+1

tak. ale dlaczego dane wejściowe są niezdefiniowane/nie istnieją? – Fahad

+3

@Fahad, ponieważ cykl kątowy $ digest trwa, zanim wartość zostanie wypełniona ze sterownika. – m59

+0

o tak ... czy jest jakieś rozwiązanie tego problemu? – Fahad

Powiązane problemy