Селектор DOM AngularJS

У меня есть несколько пользовательских директив, которые используют jQuery для анимационных эффектов (встроенные в angular ngShow/ngHide и т.п. функциональны, но некрасивы). Я помню, как где-то читал в документации, что у angular есть свой собственный селектор DOM (что-то вроде angular.export() или angular.select()), который я должен использовать вместо $(SELECTOR); однако я не могу найти его сейчас.

Я делаю что-то вроде этого:

//view
<div scroll-to="element"> //`element` is set via ng-click
  …
</div>

//directive
link: function(scope, elm, attrs)
{

  scope.$watch(attrs.scrollTo, function scrollToAction(newValue,oldValue)
  {
    if ( newValue !== oldValue )
    {
      elm.animate({
        scrollTop:
          $('#'+newValue).offset().top //replace jquery selector with angular's
          - elm.offset().top
          + elm.scrollTop()
      });
    }
  });

}

На самом деле я не манипулирую $('#'+newValue), просто получаю информацию о нем, поэтому я не думаю, что совершаю преступление против Angular.


person Jakob Jingleheimer    schedule 07.03.2013    source источник


Ответы (2)


"jqLite" (определенный на странице angular.element) предоставляет методы обхода DOM, такие как children(), parent(), contents(), find(), next() (но не previous()). Метода, подобного селектору, не существует.

Вы можете попробовать querySelector JavaScript.

person Mark Rajcok    schedule 07.03.2013
comment
+1 Я также добавил дополнительную информацию, которая может объяснить, почему ОП считает, что он видел угловой метод, с помощью которого вы можете выбирать элементы. - person Ben Lesh; 08.03.2013
comment
А, спасибо, да, это точно. Я включаю jquery перед angular, так что angular.element() все еще предпочтительнее? Кажется, что это просто добавит дополнительные накладные расходы на разрешение псевдонима. - person Jakob Jingleheimer; 08.03.2013
comment
@jacob, я бы использовал angular.element(), чтобы, если в будущем ваш код больше не нуждался в jQuery, вам не пришлось его обновлять. - person Mark Rajcok; 08.03.2013

Как говорится в официальном документе AngularJs

Все ссылки на элементы в Angular всегда обёрнуты в jQuery или jqLite (например, аргумент элемента в директиве compile /функция связи). Они никогда не являются необработанными ссылками на DOM.

В деталях: если вы включаете jQuery перед ссылкой на Angular, функция angular.element() становится псевдонимом для jQuery (в противном случае это jqLite, см. ответ Марка Райкока).


Вы можете проверить в отладчике Dev Tool, получаете ли вы jQuery или jqLite, поставив точку останова в строке, где вы вызываете angular.element(). При наведении вам будет предложена соответствующая библиотека, см. скриншот ниже (в моем случае я получаю jQuery).

jQuery для ‹code›angular.element()‹/code›


Как говорится в официальном документе AngularJs

Для поиска по имени тега попробуйте вместо этого angular.element(document).find(...) или $document.find()

Другими словами: если вы получаете jQuery при вызове angular.element(), то что-то вроде angular.element('#foo > bar') работает, если вы об этом думаете.


Если вам интересно, как получить эту функцию выбора без jQuery, вы можете использовать Sizzlejs. Sizzle — это библиотека селекторов, которую jQuery использует под капотом< /а>.

person Ben Lesh    schedule 07.03.2013