Angular.js 移动浏览器应用程序在 iOS 8 Safari 上冻结

Angular.js mobile browser app freezes on iOS 8 Safari

我们的 Angular.js Web 应用程序有时会在 iOS8 Safari 上冻结。发生此问题时,不会触发 ng-click 回调。如果您将 ng-click 替换为常规的 javascript onclick,它将起作用。在 iOS8 台设备上的 Chrome 中不会发生这种情况。

有没有其他人在 iOS8 Safari 上注意到这个问题或有解决办法?

这个简单的视图 有时会在 iOS8 safari 上冻结。冻结通常发生在您打开选项卡、转到浏览器上的其他选项卡或可能离开浏览器体验并稍后返回时。在此示例中,当点击链接时视图冻结时,tapCount 不会增加。视图越复杂,它就越容易冻结。在此示例中,当我快速点击链接时,浏览器会冻结几秒钟。通常在真正复杂的视图上冻结需要更长的时间。

var app = angular.module('myApp', []);
app.controller('freezeCtrl', function($scope) {
  $scope['tapCount'] = 0;

$scope['dummyItems'] = [];
for(var i = 0; i < 15; i++) {
    var anItem = {'id': i};
    ($scope['dummyItems']).push(anItem);
}

$scope['updateTapCount'] = function() {
    $scope.tapCount += 1;
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>
<div  ng-app="myApp">
  <div ng-controller="freezeCtrl">
    <p>Tap Count = {{tapCount}}</p>
    <ul>
        <li ng-repeat="item in dummyItems" bindonce>
            <p>This is a dummy item #{{item.id}}</p>
        </li>
    </ul>
    <div>
      <button ng-click="updateTapCount()">Button 1</button>
      <button ng-click="updateTapCount()">Button 2</button>
    </div>
  </div>
</div>

我找到了解决方案,而且我似乎在别人修复 Angular 中的错误时找到了解决方案!固定在 Angular 1.3.x.

错误位于 angular.js 代码中的 "isArrayLike"。有时 obj.length 在赋值后未定义 "var length = obj.length;" 变量长度得到值“1”。这将导致 isArrayLike 对于不是 arrayLike 的对象返回 true。这个错误尤其会破坏 angular 的 forEach 和随后的 JQLite "eventHandler"。因此,当发生这种情况时,不会执行任何事件处理程序。