2015-05-01 27 views
6

Angular.js Web Uygulamamız bazen iOS8 Safari'de donuyor. Bu sorun olduğunda, ng tıklama geri çağrısı tetiklenmez. Eğer ng tıklama ile normal javascript onclick'i değiştirirseniz, işe yarayacaktır. IOS8 cihazlarda Chrome'da gerçekleşmez.Angular.js mobil tarayıcı uygulaması iOS 8'de donuyor Safari

iOS8 Safari'de bu sorunu gören başka biri var mı, yoksa düzeltmesi mi var?

Bu basit görünüm bazen iOS8 safari'da donuyor. Freeze genellikle sekme açık olduğunda, tarayıcıdaki diğer sekmelere gittiğinizde veya tarayıcı deneyiminden çıkıp daha sonra geri geldiğinizde olur. Bu örnekte, tapCount bağlantılarına dokunurken görünüm donuyorsa, artmaz. Görünümü ne kadar karmaşıksa, dondurması ne kadar kolaylaşır. Bu örnekte, bağlantılara hızlıca dokunduğumda birkaç saniye boyunca tarayıcı donuyordu. Genellikle donma gerçek karmaşık görünümlerde daha uzun sürer.

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

Bu davranışı gördüğünüz en basit uygulama örneği gönderir misiniz? – xpereta

+0

Merhaba xpereta, bir dakika veya daha fazla süre boyunca dondurmayı yeniden yapabildiğim çok basit bir örnek ekledim. –

cevap

2

çözüm bulundu ve doğru Açısal içinde hata düzeltildi başka zaman birisi hakkında çözüm bulmuş gibi görünüyor! Angular 1.3.x'te sabitlenmiştir.

Hata, angular.js kodunda "isArrayLike" konumunda. Bazen obj.length, "var length = obj.length;" ifadesinden sonra tanımsızdır. değişken uzunluk "1" değerini alır. Bu, arrayLike olmayan nesneler için true döndüren isArrayLike ile sonuçlanır. Özellikle bu hata, açısal formun önünü ve daha sonra JQLite'nin "eventHandler" i kırıyordu. Yani bu olay olduğunda hiçbir olay işleyicisi çalıştırılamaz.

+0

Bu webkit hatayı: http://trac.webkit.org/changeset/182058/trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h –

+1

isArrayLike n 1.2.x ve 1.3.x'in uygulanması, global değişkenin yanı sıra, aynıdır . Phantom object.length özelliği için webkit sorunundan bahsettiğinizi görüyorum - 1.2.x'de bunun nasıl yama/çözüm olabileceğine dair bir ipucunuz var mı? –

+0

Şaşırtıcı bir şekilde, bir satır büyük bir fark yarattı. Bazen - her zaman - iOS8 safari atamadan sonra "uzunluk" 1 değerini alırken, obj.length tanımsızdır. Bu bir JIT hatası nedeniyle görünüyor. IsArrayLike, arrayLike olmayan nesneler üzerinde true değerini döndürmesine neden olur; bu, "forEach" nesnesinin nesne anahtarları üzerinde yinelememesine neden olur çünkü isArrayLike için yapılacak kontrol, forEach uygulamasında ilk gelir. nesneler üzerinde yinelemeyen forE, forEach öğesinin forEach (eventHandlersCopy, ..) öğesinde createEventHandler'da çağrıldığında, obj olay işleyicilerinin çalıştırılmasına neden olur. –

İlgili konular