2013-10-09 2 views
6

Я пишу угловое приложение, используя угловой-ui-router для управления состояниями/маршрутизацией.Отключение медленного изменения состояния углового ui-маршрутизатора на Mobile Safari

В настольных браузерах (Chrome/Safari) это работает нормально. Однако на Mobile Safari на IOS 6 на iPhone 4 (и в меньшей степени на IOS 7 на iPhone 5) изменение состояния через $ state.go может занять до 2 секунд.

Я использую ngTouch, поэтому я не думаю, что это 300 мс, которое происходит с помощью собственного события щелчка. ngНажмите атрибуты, которые не вызывают $ state.go, теперь, похоже, работают очень быстро.

Как я могу отладить это, чтобы найти, где расходуется время?

+0

У вас есть решение? У меня такая же проблема. –

ответ

4

ngTouch не работает с директивой ui-sref. Мы использовали fastclick.js для обработки поведения кликов и удаления ngTouch. Проблема в том, что директивы наступают на события друг друга и на самом деле несовместимы. Вы можете это увидеть, прочитав реализацию обеих директив.

+0

Я отказался от этого, так как я не думаю, что он отвечает на мой вопрос относительно отладки. –

+1

Как я уже сказал, это не сработает, поэтому функция ngTouch *** фактически не работает ***. Если вам нужны детали, пойдите, прочитайте источник этих двух, как я. Вы обнаружите, что ui-sref поглощает события щелчка, используя свои собственные методы, поэтому он никогда не делает это для материала ngTouch. В итоге мы использовали fastclick.js вместо ngTouch, он отлично работает. Я думаю, что на самом деле мой ответ БОЛЕЕ полезен для вас, чем если бы я рассказал вам о том, как прочитать источник двух директив (что я и сделал), чтобы увидеть, что они наступают друг на друга. –

+0

Я не использую директиву ui-sref, поэтому я не думаю, что там время тратится. Все наши изменения маршрута программируются через '$ state.go', изначально инициированный стандартными атрибутами «ng-click». Кроме того, мой вопрос заключается в том, как отлаживать ситуацию ... Может быть, мне более точно нужно было спросить, как профилировать определенные части приложения на iPhone. –

1

Использование console.time распечатать в Mobile Safari консоли https://developer.chrome.com/devtools/docs/console-api#consoletimelabel

... в сочетании с пользовательским интерфейсом маршрутизаторами слушателей:

  • $ stateChangeStart
  • $ stateChangeSuccess
  • $ viewContentLoading
  • $ viewContentLoaded

    /* EXAMPLE - INCREMENT THE TIMER 
         FOR EACH ONE OF THE LISTENERS, TO DETECT THE BOOTLENECK */ 
    
        // START TIMING NOW 
        console.time('state_transition'); 
        /* 
        http://devin-clark.com/what-you-might-not-know-about-chrome-devtools/ 
        */ 
    
         $rootScope.$on('$stateChangeSuccess', 
          function(event, toState, toParams, fromState, fromParams){ 
          console.timeStamp('state_transition'); 
        }); 
    
        // STOP TIMER 
        console.timeEnd('state_transition'); 
    

http://www.ng-newsletter.com/posts/angular-ui-router.html


Кто знает, может быть, для улучшения реактивности Ui-маршрутизатора на мобильных устройствах, FutureState из массовки UI-маршрутизатора может быть что-то стоит изучить:

http://christopherthielen.github.io/ui-router-extras/#/future


... но единственный способ убедиться в том, чтобы понять внутренности мобильных браузеров и eir DOM/JS/GPU для управления настольными браузерами.

Возможно, что ng-animate требует слишком большого количества мобильного браузера, создавая «следующий» шаблон перед его появлением в окне просмотра. И все же это может быть нечто совершенно тривиальное. Пожалуйста, сообщите нам свой прогресс.