我正在观察我的角度项目中的两个值:$scope.$watchGroup( ['currentPage', 'newStatus'], $scope.setPage )
。
当两个值都在改变时,$ scope.setPage会相应地执行两次,但它应该一次。如何实现这个?
我的代码:
JS
app.controller('CategoryListCtrl', ['$scope', '$http', '$location', '$route', function($scope, $http, $location, $route) {
$scope.numPerPage = 5;
$scope.currentPage = 1;
$scope.newStatus = -1;
var currentPageChanged = false;
var newStatusChanged = false;
function setPage() {
// function's code based on requests to db
};
setPage();
// pagination based on db requests
$scope.$watchGroup( ['currentPage', 'newStatus'], function(newValues, oldValues) {
if ((newValues[0] != oldValues[0]) && !newStatusChanged) {
console.log(1);
// currentPage has changed
setPage();
currentPageChanged = true;
} else if ((newValues[1] != oldValues[1]) && !currentPageChanged) {
console.log(2);
// newStatus has changed
newStatusChanged = true;
} else {
console.log(3);
newStatusChanged = false;
currentPageChanged = false;
}
});
...
HTML
...
<th>
<select class="form-control"
ng-model="isPublic"
ng-options="isPublic.name for isPublic in isPublicScope"
ng-change="newStatus = isPublic.status; currentPage = 1;">
<option value="">Show all</option>
</select>
</th>
<tr ng-repeat="category in categories | filter:search">
</tr>
...
答案 0 :(得分:2)
您可以添加一个标志,当两个值第一次更改时(仅一次),该标志会更改。之后您可以禁用手表。
以下是一个示例:jsbin example
也可以这样写:editted
在此示例中,给出了两个文本框,只有当第一次更改两个文本框值时,手表才会将计数增加到1.之后,手表将被禁用,因此即使更改时计数也不会增加发生在文本框中。
如果代码略有变化,您可以从此示例中获得所需内容。
答案 1 :(得分:1)
这应该可以解决问题(未经测试):
var w = $scope.$watchGroup( ['currentPage', 'newStatus'],
function(newValues, oldValues) {
if ((newValues[0] != oldValues[0]) || (newValues[1] != oldValues[1])) {
$scope.setPage;
// clear $watchGroup
w();
}
}
)