Игнорировать директиву при загрузке страницы

0

Я установил директиву ниже, чтобы сосредоточиться на "новейшем" поле ввода, которое добавлено на мою страницу. Это отлично работает, кроме одной проблемы. При загрузке страницы выбирается последний вход на странице. Я хочу, чтобы эта директива игнорировалась при загрузке страницы, поэтому я могу вместо этого установить фокус на кнопку с идентификатором #new-query. Нужно ли вообще указывать этой директиве, чтобы начать просмотр области после того, как пользователь взаимодействует со страницей?

'use strict';

angular.module('app')
  .directive('setFocus', setFocus);

function setFocus($timeout, $parse) {
  return {
    link: function(scope, element, attrs) {
      var model = $parse(attrs.setFocus);
      scope.$watch(model, function(value) {
        if (value) {
          $timeout(function() {
            element[0].focus();
          });
        }
      });
    }
  };
}

Пример того, как я использую эту директиву:

<div ng-show="parameter.repeatable" ng-repeat="index in parameter.values track by $index">
  <input
    name="parameter"
    type="text"
    ng-model="parameter.values[$index]"
    set-focus="$last">
    ...

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

  • 0
    если он находится в форме, можно использовать свойство $dirty объекта для этого имени элемента. Не понятно, как вы используете это
  • 0
    Пожалуйста, покажите нам DOM, который запускает эту директиву
Показать ещё 10 комментариев

2 ответа

0

Вот обходной путь, который может быть подходящим

В контроллере:

$scope.page ={first_load: true};

Директива:

function setFocus($timeout, $parse) {
  return {
    link: function(scope, element, attrs) { 
        if (!scope.page.first_load && $last) {
          $timeout(function() {
            element[0].focus();
          });
        }
         // last item of first rendering of 'ng-repeat' will update controller 
         if(scope.page.first_load && $last){
            scope.page.first_load = false;
         }

      });
    }
  };
}
  • 0
    Сначала выполняется контроллер, и first_load все равно будет истинным
  • 0
    @CharlieH правильно, OP не хочет, чтобы это активировалось в первый раз. Только когда элементы добавлены
0

В вашем контроллере

$scope.loaded = false;

В вашей функции связи

link: function(scope, element, attrs) { 
        if (!scope.$parent.loaded) {
            scope.$parent.loaded = true;
            return;
        }

        // Do the focusing here
}
  • 1
    не будет работать должным образом, потому что ng-repeat создает дочернюю область .... только изменит текущую дочернюю область. Вот почему я использовал объект для наследования
  • 0
    Благодарю. Под редакцией ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню