2015-04-28 2 views
2

У меня есть директива для автоматической фокусировки следующего входа, как показано ниже. Проект является угловым для ионического. Он работает в другом проекте (который основан на телефоне - не ионный), но в этом ионном проекте он не играет в мяч. Разметка такая же.Почему в моем коде не первый раз фокусируется на jqLite?

(function() { 
'use strict'; 
angular.module('appname.directives') 
    .directive('focus', [function() { 
    return { 
     restrict: 'A', 
     link: function($scope,elem) { 

      //after character keypress the focus switches to the next input 
      elem.bind('keyup', function(e) { 

       if (e.keyCode >= 48 && e.keyCode <= 90 || e.keyCode >= 96 && e.keyCode <= 105) { 

        if (elem[0].value !== "") { 
         if (elem.nextAll('input') && elem.nextAll('input').length > 0) { 
          elem.nextAll('input').first().focus();  
         } else { 
          elem.parent().parent().nextAll(".module__inner").first().find('input').first().focus();  
         }   
        } 
       } 
      }); 
     } 
    }; 
}]); 
})(); 

HTML, выглядит как ниже:

<div class="input-holder"> 
     <input data-order="1" focus /> 
     <input data-order="2" focus /> 
     <input data-order="3" focus /> 
    </div> 

Самое странное в том, что при отладке я могу увидеть код выполнения строки «elem.nextAll („вход“) первым.() .focus();»

Это нажимает на родную клавиатуру, но не фокусирует следующий вход. Странно, когда я перехожу к следующему входу, тогда директива работает, и я могу вернуться к первой и автоматической вкладкам, как и ожидалось.

С точки зрения привязки директивы, я могу отлаживать и видеть, как это срабатывает, поэтому это может быть проблема, связанная с этим. HTML является статическим, поэтому это не проблема делегирования событий.

Я озадачен этим, единственное, что я продолжаю возвращать, - это тот факт, что начальный .focus(), похоже, не фокусируется, и каждый раз, когда он это делает.

Я пробовал обернуть его в $ timeout и $ scope. $ Apply(), но не работает.

У кого-нибудь есть представление о чем-то, что я могу попробовать?


EDIT


Как ни странно, это работает, как ожидалось, когда мои Chrome Dev инструменты не открыт. Он также не работает на устройстве. Я не вижу, какая разница здесь будет отличаться от, возможно, более медленного цикла выполнения?

+0

вам, возможно, потребуется запустить цикл дайджеста. В то же время, имея дело с событиями –

+0

, вы пробовали использовать 'ng-keyup'? – charlietfl

+0

@pankajparkar вы имеете в виду, используя $ scope. $ Apply()/$ timeout? Я пробовал это –

ответ

0

У меня есть аналогичная проблема на устройстве.

Если вы используете ионную + AngularJS, оказывается, что вам нужно добавить плагин Keyboard Ионные и эти предпочтения в config.xml

<preference name="KeyboardDisplayRequiresUserAction" value="false" /> 

<feature name="Keyboard"> 
    <param name="ios-package" value="IonicKeyboard" onload="true" /> 
</feature> 

KeyboardDisplayRequiresUserAction предпочтение является тот, который препятствует функции фокусировки.