Javascript AngularJS:获取筛选的ng重复结果计数以更新我的分页
我的代码解释: 下面是一个带有Javascript AngularJS:获取筛选的ng重复结果计数以更新我的分页,javascript,angularjs,angular-ui-bootstrap,mean-stack,meanjs,Javascript,Angularjs,Angular Ui Bootstrap,Mean Stack,Meanjs,我的代码解释: 下面是一个带有ng repeat的简单表格,它在ctrl.persons中循环,并将结果存储在变量ctrl.results中。包含一个过滤器,允许用户使用文本输入搜索结果,sliceResults是my的自定义过滤器(它根据分页的当前页面确定要显示的结果的偏移量和限制) {{$index+1}} {{result.firstName} {{result.lastName} 结果:{ctrl.Results.length} 情况: 在代码末尾,ctrl.results.leng
ng repeat
的简单表格,它在ctrl.persons
中循环,并将结果存储在变量ctrl.results
中。包含一个过滤器,允许用户使用文本输入搜索结果,sliceResults
是my的自定义过滤器(它根据分页的当前页面确定要显示的结果的偏移量和限制)
{{$index+1}}
{{result.firstName}
{{result.lastName}
结果:{ctrl.Results.length}
情况:
在代码末尾,ctrl.results.length
实时返回结果量,并在用户填写文本输入以搜索结果时相应更改
但是,当结果量发生变化时,我的分页不会相应地发生变化,因此显示的页数不正确(例如,它仍然可以显示3页,而只有1页)。页数基于控制器中的变量(this.paginationtalItems
)
问题:
当视图中的结果量(ctrl.results.length
)发生变化时,如何更新控制器中的变量this.paginationtalItems
?(或者,有什么替代方法来更新我的分页?)
我的尝试:
我远不是一个AngularJS专家,所以不要嘲笑我!我尝试将一个函数放入带有结果计数的ng change
,但失败了,因为它显然需要ng model
,我看不到使用ng repeat
我还尝试在ctrl.results
变量上使用$watch
,但这导致了一个巨大的控制台错误,因为它在x次迭代后中止。另外,我不想使用$watch
,因为我读到它只适用于$scope
,我不想使用它(我使用“controller as”语法)
提前感谢,我将接受帮助我解决问题的答案。您可以在控制器中使用带有controllerAs语法的
$watch
。我知道你说过这不是你的首要任务,但我认为这可能是你最好的解决办法。它看起来像这样:
.controller('myCtrl', function () {
var ctrl = this;
...
$scope.$watch(angular.bind(this, function () {
return this.results.length;
}), function (newVal) {
ctrl.paginationTotalItems = //whatever logic you have
});
....
});
function MyCtrl() {
var ctrl = this;
ctrl.paginationTest = 1;
ctrl.persons = [1,2,3,4,5];
ctrl.calcPagination = function () {
ctrl.paginationTest = Math.floor(Math.random() * 10);
}
}
编辑:好的,我刚刚想到了另一种方法,您不必使用$scope
。它在控制器上包含一个函数,并使用ng init
调用该函数,该函数将更新变量(ng init
将在迭代列表每次更改时激发):
因此,经过大量简化后,控制器将如下所示:
.controller('myCtrl', function () {
var ctrl = this;
...
$scope.$watch(angular.bind(this, function () {
return this.results.length;
}), function (newVal) {
ctrl.paginationTotalItems = //whatever logic you have
});
....
});
function MyCtrl() {
var ctrl = this;
ctrl.paginationTest = 1;
ctrl.persons = [1,2,3,4,5];
ctrl.calcPagination = function () {
ctrl.paginationTest = Math.floor(Math.random() * 10);
}
}
HTML将是:
<table>
<input ng-model="searchKeywords"/>
<tr ng-repeat="result in ctrl.results = (ctrl.persons | filter:searchKeywords)" ng-init="ctrl.calcPagination()">
<td>{{ result }}</td>
<td>{{ctrl.paginationTest}}</td>
</tr>
</table>
{{result}}
{{ctrl.paginationTest}
下面是一个例子,看看第二列,看看它在输入元素中的每次更改后都会发生变化。在您的情况下,您只需重新计算
ctrl.paginationtalitems
我知道这个问题得到了回答,但我想分享我的经验
我在使用@Omri Aharon建议的ng init
时遇到了一些问题,因为每次我更改文本输入中的值时,它都没有调用函数,我只是将ng init
从
中删除,并将ng change=“ctrl.calcPagination()”
添加到输入中,就解决了这些问题
HTML代码如下所示:
<tbody>
<div class="input-group">
<span class="input-group-addon glyphicon glyphicon-search" aria-hidden="true"></span>
<input type="text" class="form-control" placeholder="Filter..." ng-model="ctrl.filterName" ng-change="ctrl.calcPagination()">
</div>
<tr ng-repeat="item in ctrl.list | filter: ctrl.filterName | orderBy: ctrl.sortType:ctrl.sortReverse | clientPaginator:ctrl.currentPage:ctrl.itemsPerPage">
<td>{{item.property}}</td>
</tr>
</tbody>
感谢@Omri Aharon提供这个简单的解决方案 谢谢你的回答。是的,您的
$watch
似乎工作正常!我一定是把我的搞砸了。但是,有没有一种方法可以在没有$watch
的情况下实现这一点?我的控制器中没有$scope
(我可以添加它,但我宁愿不添加)。@Nic实际上,可能有。。只是想到了另一种可能适合你的方法。让我马上更新答案。@Nic更新了答案。