滚动到第一个错误不起作用

时间:2014-09-01 10:28:03

标签: javascript angularjs

我的控制器中有以下功能

$scope.progress = function () {
    var form = $scope.coverDetails;
    for (i in form) {
        if ($scope.coverDetails[i].hasOwnProperty('$valid') && !$scope.coverDetails[i].$valid) {
            $location.hash(i + '-label');
            break;
        }
    };

    $scope.submitted = true;
    $scope.validateForm();

    if ($scope.coverDetails.$valid) {
        $location.path('/zones');
    }

    $anchorScroll();
};

这很有效。但不是真的。 当我单击提交按钮(调用上面的函数)时,它成功更新了哈希,但是,{2}或ng-class指令都没有更新,直到第二次按下按钮,假设{{ 1}}在第一个和第二个之间没有变化。

其中一个不起作用的例子是

ng-show

在此示例中,未应用类$location.hash,但如果该字段无效,则会滚动到标签。

谁能帮忙?

1 个答案:

答案 0 :(得分:0)

所以我弄清楚发生了什么, 更改哈希导致tempalte重新加载,因此必须使用以下代码

来防止这种情况
angular.module("ScrollToErrorPrevention", []).factory('$preventErrorReload', ['$route',
    function ($route) {
        return function ($scope) {
            var lastRoute = $route.current;
            $scope.$on('$locationChangeSuccess', function () {
                if (lastRoute.$$route.templateUrl === $route.current.$$route.templateUrl) {
                    $rootScope.$broadcast('locationChangedWithoutReload', $route.current);
                    $route.current = lastRoute;
                }
            });
        };
    }
])

并将其包含在应用内:

angular.module('app', ['ScrollToErrorPrevention'])

并从控制器中调用工厂方法

angular.module('app').controller('controller', ['$scope', $preventErrorReload, 
    function($scope, $preventErrorReload) {
         $preventErrorReload($scope);

         ...
    }
]);

在此之后,使用$location.hash(...)$anchorScroll()一起工作正常

这项工作并非完全由我自己完成,而是从一个或两个(更多?)其他来源修改