Javascript AngularJS自定义筛选器调用两次,并在第二次调用时删除输入数据

Javascript AngularJS自定义筛选器调用两次,并在第二次调用时删除输入数据,javascript,angularjs,Javascript,Angularjs,这是密码 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将包含来自HTTP GET请求的数据数组。 以下

这是密码

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将包含来自HTTP GET请求的数据数组。 以下是用于结果分页的自定义筛选器的代码。基本上,这将限制结果仅为5。分页按钮将更新$scope.currentPage的值

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;
        }
    }
});
app.filter(“limitResults”),函数($filter,$log){
返回函数(数据、页面、大小){
if(angular.isArray(数据)&angular.isNumber(页面)&angular.isNumber(大小)){
var起始页=(第1页)*大小;
如果(数据长度<起始页){
返回[];
}否则{
$log.info(数据);
$log.info(第页);
$log.info(大小);
$log.info(起始页);
返回$filter(“limitTo”)(数据拼接(起始页),尺寸);
}
}否则{
返回数据;
}
}
});
这是将呈现数据的HTML页面

<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>

{{video.snippet.title}

{{video.snippet.channelTitle}

{{video.snippet.description}

我在自定义过滤器中放了几行$log.info代码,以查看应用过滤器时实际发生的情况。过滤器运行两次,这是正常行为

我感到困惑的是,当自定义过滤器第一次运行时,$log.info(data)记录从控制台的HTTP GET调用接收到的原始数据。但是,当自定义筛选器第二次运行时,$log.info(数据)将一个空数组记录到控制台

考虑到“$log.info(data);$log.info(page);$log.info(size);”被记录到控制台的事实,很明显第二个IF语句(IF(data.length
我只是不明白为什么当过滤器第二次运行时,数组(传递给自定义过滤器的数据)会变空。

您看到空数组的原因是因为拼接方法

$filter("limitTo")(data.splice(startPage), size);
拼接方法语法

array.splice(start, deleteCount[, item1[, item2[, ...]]])
如果在没有第二个参数的情况下调用splice方法,这意味着如果没有传递deleteCount,deleteCount将被视为[arr.length-start]。在您的情况下,当第一次执行筛选器时,整个数组将变为空


对于拼接方法,请在
返回[]
时尝试记录
startPage
data.length
并查看结果。我认为您需要修改过滤器表达式。尝试
返回$filter(“limito”)(数据、大小、起始页)