有没有办法在$ watchGroup中触发一次回调函数Angularjs?

时间:2015-05-12 09:35:17

标签: javascript angularjs

我正在观察我的角度项目中的两个值:$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>
...

2 个答案:

答案 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();
        }

    }
)