2015-05-01 11 views
6

La nostra app Web Angular.js talvolta si blocca su iOS8 Safari. Quando si verifica questo problema, la richiamata con ng-clic non viene attivata. Se sostituisci ng-clic con un normale javascript onclick, funzionerebbe. Non succede in Chrome su dispositivi iOS8.L'applicazione browser mobile Angular.js si blocca su iOS 8 Safari

Qualcun altro ha notato questo problema su iOS8 Safari o ha una soluzione per questo?

Questa semplice vista si blocca a volte su iOS8 safari. Il blocco di solito si verifica quando la scheda è aperta, passa ad altre schede del browser o forse lascia l'esperienza del browser e torna più tardi. In questo esempio quando la vista si blocca mentre si tocca il link tapCount non aumenta. Più è complicata la vista e più facile diventa il congelamento. In questo esempio, il browser si blocca per alcuni secondi quando tocco rapidamente i collegamenti. Di solito il congelamento richiede più tempo per le viste realmente complicate.

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

Puoi pubblicare un esempio dell'app più semplice se vedessi questo comportamento? – xpereta

+0

Ciao xpereta, ho aggiunto un esempio molto semplice in cui sono stato in grado di riprodurre il blocco per un minuto o più. –

risposta

2

ho trovato la soluzione e sembra che ho trovato la soluzione giusta per il tempo qualcun altro risolto il bug in angolare! È stato risolto in Angular 1.3.x.

Il bug si trova in "isArrayLike" nel codice angular.js. A volte mentre obj.length non è definito dopo l'assegnazione "var length = obj.length;" la lunghezza variabile ottiene il valore "1". Ciò comporterebbe isArrayLike che restituisce true per oggetti che non sono arrayLike. Questo bug, in particolare, spezzerebbe "forHandler" di angular's per Each e successivamente di JQLite. Quindi nessun gestore di eventi verrebbe eseguito quando ciò accadesse.

+0

Questo è il bug del webkit: http://trac.webkit.org/changeset/182058/trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h –

+1

Implementazione di isArrayLike n 1.2.xe 1.3.x è identico oltre all'utilizzo della variabile globale . Vedo che hai menzionato il problema del webkit per la proprietà phantom object.length - Hai un suggerimento su come questo potrebbe essere corretto/risolto in 1.2.x? –

+0

Sorprendentemente questa linea ha fatto una grande differenza. A volte - non sempre - su iOS8 safari dopo l'assegnazione "length" ottiene il valore 1 mentre obj.length non è definito. Questo sembra essere causato da un errore JIT. Ciò provocherebbe a isArrayLike di restituire true su oggetti che non sono arrayLike, il che farebbe sì che l'oggetto "forEach" fallisca l'iterazione sulle chiavi dell'oggetto perché il controllo di isArrayLike viene prima nell'implementazione forEach. forEach non riuscendo a iterare su obj keys potrebbe causare che i gestori di eventi obj non vengano eseguiti quando forEach viene chiamato a forEach (eventHandlersCopy, ..) su createEventHandler. –

Problemi correlati