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"。因此,当发生这种情况时,不会执行任何事件处理程序。
我们的 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"。因此,当发生这种情况时,不会执行任何事件处理程序。