2014-10-18 4 views
0

Я разрабатывал модуль, в котором мне нужно было создать ввод текста вручную (при вводе или нажатии кнопки) и автофокусироваться на этом вводе сразу после его добавления в список. Пока функция работает, но когда я открываю журнал консоли, появляется ошибка $digest already in progress. Какой-то странный, но если я удалю некоторые $ eval или $ apply, код не будет работать.Автофокусировка на последнем элементе ввода

Вот мой plnk демо для справки: Demo

function keyEnter($document) { 
    return { 
    restrict: "A", 
    scope: false, 
    link: function(scope, ele, attrs) { 
     ele.bind("keydown keypress", function(event) { 
     if (event.which === 13) { 
      scope.$apply(function() { 
      scope.$eval(attrs.keyEnter); 
      }); 
      event.preventDefault(); 
     } 
     }); 
    } 
    } 
} 

function customAutofocus() { 
    return { 
    restrict: 'A', 
    link: function(scope, element, attrs) {  
     scope.$watch(function() { 
     return scope.$eval(attrs.customAutofocus); 
     }, function(newValue) { 
     if (newValue === true) { 
      element[0].focus(); 
     } 
     }); 
    } 
    }; 
} 

Я следовал автофокусировку от этого thread, он не показывает какую-либо ошибку, даже если я применил ту же логику. Единственное различие заключается в том, что я использую угловой 1.3, а его значение равно 1.2

Что мне делать, чтобы улучшить код, чтобы избежать ошибки $ digest? Любая помощь действительно ценится, спасибо заранее

ответ

2

I a dapted your plunk, так что это работает.

взглянуть на новую директиву:

function customAutofocus($timeout) { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      //rember this gets run only only 
      //once just after creating the element, so I just neet to focus once, when 
      // this digest cycle is done! 
      $timeout(function() { 
       // use a timout to foucus outside this digest cycle! 
       element[0].focus(); //use focus function instead of autofocus attribute to avoid cross browser problem. And autofocus should only be used to mark an element to be focused when page loads. 
      }, 0); 
     } 
    }; 
    } 

Это делает использование как угловых работ.

+0

ничего себе, не знал, что это было легко ... большое вам спасибо –

Смежные вопросы