Я использую «Angularized» версию элемента управления Spin, как описано здесь: http://blog.xvitcoder.com/adding-a-weel-progress-indicator-to-your-angularjs-application/
Одна из вещей, которые мне не нравятся в показанном решении, - это использование jQuery в сервисе, который эффективно прикрепляет управление вращением к элементу DOM. Я бы предпочел использовать угловые конструкции для доступа к элементу. Я также хотел бы избежать «жесткого кодирования» идентификатора элемента, к которому должен подключиться счетчик, внутри службы и вместо этого использовать директиву, которая устанавливает идентификатор в службе (singleton), чтобы другие пользователи службы или Сам сервис не должен знать это.
Я борюсь с тем, что angular.element дает нам против того, что document.getElementById на том же элементе id дает нам. например. Это работает:
var target = document.getElementById('appBusyIndicator');
Ни один из них не делает:
var target = angular.element('#appBusyIndicator');
var target = angular.element('appBusyIndicator');
Я явно делаю что-то, что должно быть совершенно очевидно неправильно! Может ли кто-нибудь помочь?
Предполагая, что я могу работать выше, у меня есть похожая проблема с попыткой заменить jQuery доступ к элементу: например, $(target).fadeIn('fast');
работает
angular.element('#appBusyIndicator').fadeIn('fast')
или angular.element('appBusyIndicator').fadeIn('fast')
нет
Может кто-нибудь указать мне хороший пример документации, которая разъясняет использование углового «элемента» против элемента DOM? Очевидно, что Angular «оборачивает» элемент своими свойствами, методами и т. Д., Но зачастую трудно получить исходное значение. Например, если у меня есть <input type='number'>
поле и я хочу получить доступ к исходному содержимому, которое видно в пользовательском интерфейсе, когда пользователь вводит «-» (без кавычек), я ничего не получаю, предположительно, потому что «type = number» означает, что Angular отклоняет ввод, даже если он виден в пользовательском интерфейсе, и я хочу его увидеть, чтобы я мог проверить его и очистить.
Любые указатели / ответы приветствуются.
Спасибо.
Ответы:
Это может работать так:
Вы включаете
Document.querySelector()
нативный вызов Javascript вangular.element()
вызов. Таким образом, вы всегда получаете элемент в объекте jqLite или jQuery , в зависимости от тогоjQuery
, доступен он или загружен.Официальная документация для
angular.element
:Если вы не знаете, зачем пользоваться
document.querySelector()
, прочитайте этот ответ .источник
var autocomplete = new google.maps.places.Autocomplete( $document[0].querySelector('#address'), { types: ['geocode'], componentRestrictions: {country: 'us'} } );
. Спасибо за подсказку @kaiser. По какой-то причине API карты жаловалось, что то, что я передал в первом параметре, не было вводом, когда я использовалangular.element(document.querySelector('#address'))
, но все хорошо, что хорошо кончается.Вам следует прочитать документацию по угловым элементам, если вы еще этого не сделали, чтобы вы могли понять, что поддерживается jqLite, а что нет -jqlite - это подмножество jquery, встроенное в angular.
Эти селекторы не будут работать только с jqLite, так как селекторы по id не поддерживаются.
Итак, либо:
Изменить: Обратите внимание, что jQuery должен быть загружен до angularJS, чтобы иметь приоритет над jqLite:
Edit2: я пропустил вторую часть вопроса раньше:
Проблема с
<input type="number">
, я думаю, это не угловая проблема, это предполагаемое поведение нативного элемента номера html5.Он не вернет нечисловое значение, даже если вы попытаетесь получить его с помощью jquery
.val()
или необработанного.value
атрибута.источник
равно
источник
Я не думаю, что это правильный способ использования угловых. Если метод фреймворка не существует, не создавайте его! Это означает, что каркас (здесь угловой) не работает таким образом.
С angular вы не должны манипулировать DOM, как это (способ jquery), а использовать угловой помощник, такой как
Или создайте свою собственную директиву (свой собственный компонент DOM), чтобы иметь полный контроль над ней.
Кстати, вы можете увидеть здесь http://caniuse.com/#search=queryselector querySelector хорошо поддерживается и поэтому может безопасно использоваться.
источник
Если кто-то использует gulp, он показывает ошибку, если мы используем,
document.getElementById()
и предлагает использовать$document.getElementById()
но это не работает.Используйте -
источник
Вы можете получить доступ к элементам, используя $ document (необходимо вставить $ document)
или с угловым элементом, указанные элементы могут быть доступны как:
источник
Вы должны вставить $ document в свой контроллер и использовать его вместо оригинального объекта документа.
Если вам не требуется перенос элемента стиля jquery, $ document [0] .querySelector ('# MyID') выдаст вам объект DOM.
источник
Это сработало для меня хорошо.
источник
Улучшение ответа кайзера:
Не забудьте ввести
$document
в вашу директивуисточник
find() - Limited to lookups by tag name
он не работает с идентификаторами. Также у вас есть дополнительное закрытие)
.Может быть, я слишком поздно здесь, но это будет работать
Обратите внимание, нет
appBusyIndicator
, это просто значение идентификатора.Что происходит за кулисами: (при условии, что оно применяется к div) (взято из строки angular.js №: 2769 и далее ...)
По умолчанию, если на странице нет jQuery, будет использоваться jqLite. Аргумент внутренне понимается как идентификатор, и возвращается соответствующий объект jQuery.
источник
angular.element("#myId")
работает хорошо.