2015-05-01 20 views
6

Ứng dụng web Angular.js của chúng tôi đôi khi bị treo trên iOS8 Safari. Khi sự cố này xảy ra, gọi lại ng-click không được kích hoạt. Nếu bạn thay thế ng-click bằng javascript onclick thông thường, nó sẽ hoạt động. Nó không xảy ra trong Chrome trên các thiết bị iOS8.Ứng dụng trình duyệt di động Angular.js đóng băng trên iOS 8 Safari

Có ai khác nhận thấy sự cố này trên Safari của iOS8 hoặc có khắc phục sự cố không?

Chế độ xem đơn giản này bị treo đôi khi trên safari iOS8. Việc đóng băng thường xảy ra khi bạn mở tab, chuyển đến các tab khác trên trình duyệt hoặc có thể rời khỏi trải nghiệm của trình duyệt và quay lại sau. Trong ví dụ này khi chế độ xem bị đóng băng khi chạm vào liên kết, tapCount không tăng. Quan điểm phức tạp càng dễ bị đóng băng. Trong trình duyệt ví dụ này sẽ đóng băng trong vài giây khi tôi nhấn vào các liên kết một cách nhanh chóng. Thường đóng băng mất nhiều thời gian hơn trên các khung nhìn phức tạp thực sự.

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

Bạn có thể đăng ví dụ về ứng dụng đơn giản nhất là bạn thấy hành vi này không? – xpereta

+0

Hi xpereta, tôi đã thêm một ví dụ rất đơn giản, nơi tôi đã có thể repro đóng băng cho một phút hoặc nhiều hơn. –

Trả lời

2

Tôi tìm thấy giải pháp và có vẻ như tôi tìm thấy giải pháp đúng về thời gian người khác sửa lỗi trong góc! Nó được cố định trong Angular 1.3.x.

Lỗi ở "isArrayLike" trong mã angular.js. Đôi khi obj.length không được xác định sau khi gán "var length = obj.length;" độ dài biến đổi nhận được giá trị "1". Điều này sẽ dẫn đến isArrayLike trả về true cho các đối tượng không phải là arrayLike. Lỗi này đặc biệt sẽ phá vỡ forEach của angular và sau đó là "eventHandler" của JQLite. Vì vậy, không có trình xử lý sự kiện nào sẽ thực thi khi điều này xảy ra.

+0

Đây là lỗi webkit: http://trac.webkit.org/changeset/182058/trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h –

+1

Thực hiện isArrayLike n 1.2.x và 1.3.x giống hệt nhau bên cạnh việc sử dụng biến toàn cầu . Tôi thấy bạn đã đề cập đến vấn đề về webkit cho thuộc tính object.length của phantom - Bạn có gợi ý cách này có thể được vá/giải quyết trong phiên bản 1.2.x không? –

+0

Đáng ngạc nhiên là một dòng tạo ra sự khác biệt lớn. Đôi khi không phải lúc nào cũng trên safari iOS8 sau khi gán "độ dài" nhận giá trị 1 trong khi obj.length là không xác định. Điều này dường như được gây ra bởi một lỗi JIT. Điều này sẽ gây ra isArrayLike để trả về true trên các đối tượng không phải arrayLike mà sẽ gây ra đối tượng "forEach" để không lặp qua các khóa đối tượng vì kiểm tra cho isArrayLike đến trước trong forEach thực hiện. forEach không lặp lại các khóa obj sẽ gây ra các trình xử lý sự kiện obj không thực thi khi forEach được gọi tại forEach (eventHandlersCopy, ..) tại createEventHandler. –

Các vấn đề liên quan