iOS上的Chrome浏览器,重新加载ngRepeat过度注册

sja*_*agr 7 google-chrome ios angularjs

我用一个小的单页AngularJS应用程序遇到了令人难以置信的令人讨厌的边缘情况,我一直在为客户开发.

为简单起见,请考虑以下HTML代码:

<div ng-controller="ServiceGuideCtrl">
    <h1>Care Assessment</h1>
    <form ng-submit="loadResults($event);">
        <div>
            <h2>Is this for you or a loved one?</h2>
            <ul>
                <li><input type="radio" ng-model="who" value="Do you"> Me</li>
                <li><input type="radio" ng-model="who" value="Does your loved one"> Loved one</li>
            </ul>
        </div>
        <div ng-repeat="question in questions">
            <h2>{{ question.text }}</h2>
            <ul>
                <li><input type="radio"> Yes</li>
                <li><input type="radio"> No</li>
            </ul>
        </div>
        <p ng-show="who"><input type="submit" value="Submit answers"></p>
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

角度控制器:

app.controller('ServiceGuideCtrl', ['$scope', '$timeout', '$window', function($scope, $timeout, $window) {

        $timeout(function() {
            $window.scrollTo(0,0);
        });

        $scope.$watch('who', function(value) {
            $scope.questions = [];
            if (typeof $scope.who !== 'undefined') {
                for (var i=0; i < 20; i++) {
                  $scope.questions.push({
                      'text': $scope.who + ' need this particular thing?'
                  });
              }
            }
        });
}]);
Run Code Online (Sandbox Code Playgroud)

问题出在Chrome浏览器上的任何iOS平台上:

  1. 选择"Me/Loved one"选项之一
  2. 向下滚动问题(最好是底部),但不要点击"提交答案"
  3. 在向下滚动的同时重新加载页面
  4. 页面将"跳转"到保存的滚动位置,但由于ng-repeat元素未加载,它会过度滚动到完全深灰色的区域.
  5. 更改方向或只是稍微向后滚动页面会将页面跳转到预期的位置.

这是一个截图:

由于iOS过度滚动,空白屏幕完全变灰

Plunker:点击这里

如果您想使用自己的iOS设备在Chrome上进行测试(因为Plunker使用iFrames,并且在移动设备上滚动会发生奇怪的事情).

如你所见,$window.scrollTo(0,0)对我来说什么都没做.在加载DOM和Angular之后,Chrome for iOS似乎会应用其保存的滚动位置.如果我使用大约20-30毫秒的超时,页面会在屏幕外闪烁然后回到顶部,这证实了我的理论.问题是20-30毫秒的值仍然不可靠(它的工作时间的一半),任何更大的值都会导致更明显的屏幕闪烁.

我怎样才能这样做,以便在iOS for Chrome上重新加载包含ng-repeat元素的页面时,它不会过度滚动到空白区域?这可能是iOS Chrome浏览器中的错误吗?

应该注意的是,我会接受这个浏览器错误(读:不是我的问题),但我的办公室成员是在一个反AngularJS仇杀,所以我想解决它.

flo*_*bon 1

我没有 iPhone,几乎不明白这个问题,但由于智能手机似乎在整个页面上应用了不需要的滚动事件,我将通过为文档设置固定高度来解决这个问题,而不是处理溢出滚动在你的容器内。

html { height: 100%; }
body { height: 100%; }
.container { height: 100%; overflow: scroll; }
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/gDQNIY6kFuLnskn85yXj?p=preview