2015-05-01 69 views
6

我們的Angular.js Web應用程序有時會在iOS8 Safari中凍結。發生此問題時,不會觸發ng-click回調。如果你用普通的javascript onclick替換ng-click,它會起作用。在iOS8設備上的Chrome中不會發生這種情況。Angular.js手機瀏覽器應用程序在iOS 8 Safari上凍結

有沒有其他人注意到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>

+0

你可以發佈一個最簡單的應用程序的例子,你看到這種行爲? – xpereta

+0

嗨xpereta,我已經添加了一個非常簡單的例子,我已經能夠重新凍結一分鐘或更長時間。 –

回答

2

我找到了解決方案,好像我發現說得對固定的bug在角的時候別人的解決方案!它在Angular 1.3.x中得到了修復。

這個bug是在angular.js代碼中的「isArrayLike」。有時雖然obj.length在賦值「var length = obj.length;」之後未定義可變長度獲得值「1」。這會導致isArrayLike對不是arrayLike的對象返回true。這個bug特別會破壞angular的forEach和隨後的JQLite的「eventHandler」。所以當事件發生時,沒有事件處理程序會執行。

+0

這是webkit的錯誤:http://trac.webkit.org/changeset/182058/trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h –

+1

isArrayLike n 1.2.x和1.3.x的實現除了使用全局變量。我看到你提到了幻影object.length屬性的webkit問題 - 你有沒有提示如何在1.2.x中修補/解決這個問題? –

+0

令人驚訝的是,一條線產生了很大的不同。有時 - 永遠 - 在分配「長度」後iOS8 safari獲取值1而obj.length未定義。這似乎是由JIT錯誤引起的。這會導致isArrayLike在不是arrayLike的對象上返回true,這會導致對象「forEach」無法迭代對象鍵,因爲對isArrayLike的檢查首先在forEach實現中。 forEach無法遍歷obj鍵會導致在createEventHandler的forEach(eventHandlersCopy,..)處調用forEach時,obj事件處理程序不會執行。 –

相關問題