Angularjs 角度形式$invalid和$routeUpdate

Angularjs 角度形式$invalid和$routeUpdate,angularjs,Angularjs,我正在开发的应用程序中实现高级搜索。在此搜索中,我希望浏览器中的“后退”和“下一步”按钮与搜索一起使用 为此,我在$routeProvider中添加了以下内容: .when('/search', { templateUrl: 'Scripts/App/Views/Search.html', controller: 'SearchController', reloadOnSearch: false }) 在我的SearchController中,我在$scope上有一个搜

我正在开发的应用程序中实现高级搜索。在此搜索中,我希望浏览器中的“后退”和“下一步”按钮与搜索一起使用

为此,我在$routeProvider中添加了以下内容:

.when('/search', {
    templateUrl: 'Scripts/App/Views/Search.html',
    controller: 'SearchController',
    reloadOnSearch: false
})
在我的SearchController中,我在$scope上有一个搜索函数,它只是将一些查询字符串参数添加到我的url中:

$scope.advancedSearch = function(){
    $location.search("page", $scope.currentPage);
    $location.search("groupingField", $scope.groupingField);
    $location.search("topgroup", angular.toJson($scope.filter));
}
我听$routeUpdate,获取查询字符串参数,并使用这些参数执行搜索

$scope.$on('$routeUpdate', function () {
    var qs = $location.search();
    var topGroup = qs["topgroup"];
    $scope.filter = angular.fromJson(topGroup);
    $scope.groupingField = qs["groupingField"];
    $scope.currentPage = qs["page"];
    performSearch();
});
在我的真实搜索方法中,我检查表单是否有错误。如果有,我显示消息,否则我执行搜索(执行api调用)

使用此代码,我可以搜索并获得正确的结果。如果我进行新的搜索,它也会得到正确的结果,我可以使用浏览器中的“后退”和“下一步”按钮

当我执行搜索时,如果我的表单无效,则会显示消息,但当我在无效搜索后返回时,表单的$invalid会在调用“performSearch”方法后更新。这会导致显示“请在搜索前修复错误”消息,即使表单为$valid

如果在此之后单击“下一步”按钮,我会遇到更大的麻烦,因为表单现在是$valid,但如果填充了querystring参数,则表单应该是$invalid。同样,这仅在调用performSearch后更新。我要迟到了

如果有什么不清楚的地方,可能很难理解我的问题,赶快问吧

找到了答案! 在$routeupdate上,我等待一个摘要周期完成并更新表单属性。这可以在没有时间的情况下使用$timeout来完成

$scope.$on('$routeUpdate', function () {
    var qs = $location.search();
    var topGroup = qs["topgroup"];
    $scope.filter = angular.fromJson(topGroup);
    $scope.groupingField = qs["groupingField"];
    $scope.currentPage = qs["page"];
    $timeout(function () {
        performSearch();
    });
});
找到了答案! 在$routeupdate上,我等待一个摘要周期完成并更新表单属性。这可以在没有时间的情况下使用$timeout来完成

$scope.$on('$routeUpdate', function () {
    var qs = $location.search();
    var topGroup = qs["topgroup"];
    $scope.filter = angular.fromJson(topGroup);
    $scope.groupingField = qs["groupingField"];
    $scope.currentPage = qs["page"];
    $timeout(function () {
        performSearch();
    });
});

您是否使用$http服务来查询数据库?这可能是作用域摘要周期的一种情况,它触发有效性侦听器,而不是触发。我将在performSearch方法之前测试调用$scope.$apply()。我无法使用$scope.$apply(),因为我得到“$digest已在进行中”。正在触发摘要周期,但表单。$无效更改为延迟。我在searchForm上放置了一个手表。$无效,当应用程序已经发出请求时,它会更改。您是否使用$http服务来查询数据库?这可能是作用域摘要周期的一种情况,它触发有效性侦听器,而不是触发。我将在performSearch方法之前测试调用$scope.$apply()。我无法使用$scope.$apply(),因为我得到“$digest已在进行中”。正在触发摘要周期,但表单。$无效更改为延迟。我在searchForm上放置了一个手表。$无效,当应用程序已经发出请求时,它会发生变化。