2016-09-14 41 views
0

我搜索了很久的SO和网页,但仍找不到正确的答案。虽然有很多线程可以解决工厂/服务转换的功能,但似乎没有一个适用于我目前的情况。我经常为setter/getters和$ http调用使用Services,所以我很难找出为什么我将这个简单函数转换为Factory或Service时遇到了很多麻烦。使用Angular JS将一个简单的函数转换为工厂或服务时遇到的问题

我有我在我的HTML使用下面的代码分页的数据表:

<tr data-ng-repeat="book in filtered = (books | filter: query) | startFrom:currentPage*pageSize | limitTo:pageSize">

然后我用一个简单的函数来显示“下一步”按钮,当表包含如果只有一个页面或用户已到达最后一页,则可以隐藏多页。我这样做使用ng-show="showNext(filtered)"。功能看起来像这样:

$scope.showNext = function(filtered){ 

var numPages = Math.ceil($scope.data.length/$scope.pageSize), 
    lastPage = $scope.currentPage+1; 

if(filtered.length > $scope.pageSize && lastPage < numPages){ 
    return true; 
}else if(filtered.length > $scope.pageSize && lastPage === numPages){ 
    return false; 
}else{ 
    return false; 
} 
}; 

此功能在控制器本身很好,但是,现在我想跨越多个控制器使用它。我的第一次尝试,所以我写了这个使用一个工厂:

app.factory('PaginationService', function(){ 

var pagination = {}; 

pagination.showNext = function(data, pageSize, currentPage, filtered){ 
    var numPages = Math.ceil(data.length/pageSize), 
     lastPage = currentPage+1; 

    if(filtered.length > pageSize && lastPage < numPages){ 
    return true; 
    }else if(filtered.length > pageSize && lastPage === numPages){ 
    return false; 
    }else{ 
    return false; 
    } 
}; 

return pagination; 

}); 

然后我经过工厂作为我控制器的依赖,并调用它像这样:

$scope.currentPage = 0; 
$scope.pageSize = 10; 

$scope.showNext = function(filtered){ 
    PaginationService.showNext(data, $scope.pageSize, $scope.currentPage, filtered); 
} 

遗憾的是它不没有用,但没有错误,所以我在诊断原因时遇到了麻烦。

我也尝试使其成为一个服务是这样的:

this.showNext = function(data, pageSize, currentPage, filtered){ 
    var numPages = Math.ceil(data.length/pageSize), 
     lastPage = currentPage+1; 

    if(filtered.length > pageSize && lastPage < numPages){ 
    return true; 
    }else if(filtered.length > pageSize && lastPage === numPages){ 
    return false; 
    }else{ 
    return false; 
    } 
}; 

然后我通过服务的依赖,把它在我的控制器是这样的:

$scope.currentPage = 0; 
$scope.pageSize = 10; 

$scope.showNext = function(filtered){ 
    MyService.showNext(data, $scope.pageSize, $scope.currentPage, filtered); 
} 

我得到的相同的结果,它不起作用,但不会引发错误。

总的来说,我真的只是试图将它用作我可以传递参数的控制器之间的共享函数。如上所示,其中一些参数将是Controller的$ scope变量。我事先感谢您的帮助。

回答

1

问题是在实施控制器

$scope.showNext = function(filtered){ 
    PaginationService.showNext(data, $scope.pageSize, $scope.currentPage, filtered); 
} 

没有从$scope.showNext()返回所以鉴于它将始终评估为undefined

添加return从而通过服务函数返回的布尔值被返回到控制器示波器功能

$scope.showNext = function(filtered){ 
    return PaginationService.showNext(data, $scope.pageSize, $scope.currentPage, filtered); 
} 
+0

哇,我简直不敢相信它那么简单。我不能够感谢你!这就解释了为什么我的其他服务没有问题,而这个服务没有。再次感谢您对我的问题的快速和正确的回答,您的救星! – mlab37

+0

现在,您可以通过将设置存储在服务中并使该函数中的参数更少来使其更加平滑。一个简单的方法就是将'$ scope.pageSize'和'$ scope.currentPage'合并为一个对象 – charlietfl

+0

伟大的建议!为了确保我正确地关注你,你的意思是我可以创建一个对象,比如'$ scope。分页“,然后设置它:'$ scope.pagination.pageSize = 10; $ scope.pagination.currentPage = 0;' 然后将该对象作为一个参数传递,对吧? – mlab37

相关问题