web-dev-qa-db-ja.com

AngularJSで「未定義のプロパティ「スライス」を読み取れません」を与えるカスタムフィルター

カスタムstartFromフィルターでエラーが発生します。

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);
    }
15
Fahad Khan

フィルターは、入力が存在するかどうかを確認する必要があります。

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

そうでない場合、フィルター関数が実行され、配列または文字列のようにsliceのプロパティを持たないundefinedsliceを呼び出します。

値がないときにフィルターが呼び出される理由は、フィルターがAngular=が最初の$digestサイクルを実行するときに実行されるためです。エラーを回避するには、コントローラーですが、ifステートメントをフィルターに追加することをお勧めします。

両方のソリューションのデモがあります。 エラーがないことに注意してください。

48
m59