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

6
我们的Angular.js网络应用有时在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>


你能否发布一个最简单的应用程序示例,以便您可以看到这种行为? - xpereta
嗨xpereta,我已添加了一个非常简单的示例,我已经能够重现冻结一分钟或更长时间的情况。 - Sara Navidpour
1个回答

2
我找到了解决方案,似乎就在别人修复Angular中的错误时我也找到了解决方案!它已经在Angular 1.3.x中修复。
该bug位于angular.js代码中的“isArrayLike”。有时,在分配“var length = obj.length;”之后,obj.length未定义,变量length获得值“1”。这将导致isArrayLike为非数组对象返回true。特别是此bug会破坏angular的forEach,随后JQLite的“eventHandler”也会受到影响。因此,当发生这种情况时,没有事件处理程序会执行。

这是 WebKit 的 bug:http://trac.webkit.org/changeset/182058/trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h - Sara Navidpour
1
isArrayLike的实现在1.2.x和1.3.x中是相同的,除了使用全局变量。我看到你提到了phantom对象的length属性的webkit问题 - 你有什么提示如何在1.2.x中修补/解决这个问题吗? - Tomasz Krzywicki
令人惊讶的是,这一行代码产生了很大的差异。有时,在iOS8 Safari中,赋值后“length”会获得值1,而obj.length未定义。这似乎是由JIT错误引起的。这将导致isArrayLike在不是数组的对象上返回true,这将导致对象“forEach”在迭代对象键时失败,因为在forEach实现中首先检查isArrayLike。forEach无法迭代obj键将导致obj事件处理程序在调用forEach(eventHandlersCopy,..)时不执行createEventHandler。 - Sara Navidpour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接