J'utilise la version "angularisée" du contrôle Spin, comme documenté ici: http://blog.xvitcoder.com/adding-a-weel-progress-indicator-to-your-angularjs-application/
L'une des choses que je n'aime pas dans la solution présentée est l'utilisation de jQuery dans le service qui attache efficacement le contrôle de rotation à l'élément DOM. Je préférerais utiliser des constructions angulaires pour accéder à l'élément. Je voudrais également éviter de "coder en dur" l'identifiant de l'élément auquel le spinner doit s'attacher dans le service et utiliser à la place une directive qui définit l'identifiant dans le service (singleton) afin que les autres utilisateurs du service ou le service lui-même n'a pas besoin de le savoir.
J'ai du mal avec ce que angular.element nous donne par rapport à ce que document.getElementById sur le même élément nous donne. par exemple. Cela marche:
var target = document.getElementById('appBusyIndicator');
Aucun de ceux-ci ne:
var target = angular.element('#appBusyIndicator');
var target = angular.element('appBusyIndicator');
Je fais clairement quelque chose qui devrait être assez évident mal! Quelqu'un peut-il aider?
En supposant que je puisse faire fonctionner ce qui précède, j'ai un problème similaire en essayant de remplacer l'accès jQuery à l'élément: par exemple, $(target).fadeIn('fast');
fonctionne
angular.element('#appBusyIndicator').fadeIn('fast')
ou angular.element('appBusyIndicator').fadeIn('fast')
ne fonctionne pas
Quelqu'un peut-il me montrer un bon exemple de documentation qui clarifie l'utilisation d'un "élément" angulaire par rapport à l'élément DOM? Angular "enveloppe" évidemment l'élément avec ses propres propriétés, méthodes, etc., mais il est souvent difficile d'obtenir la valeur d'origine. Par exemple, si j'ai un <input type='number'>
champ et que je veux accéder au contenu original qui est visible dans l'interface utilisateur lorsque l'utilisateur tape "-" (sans les guillemets), je n'obtiens rien, probablement parce que le "type = nombre" signifie qu'Angular rejette l'entrée même si elle est visible dans l'interface utilisateur et que je veux la voir afin de pouvoir la tester et l'effacer.
Tous les pointeurs / réponses appréciés.
Merci.
Réponses:
Cela peut fonctionner comme ça:
Vous encapsulez l' appel
Document.querySelector()
Javascript natif dans l'angular.element()
appel. Ainsi, vous obtenez toujours l'élément dans un objet jqLite ou jQuery , selon qu'iljQuery
est disponible / chargé ou non .Documentation officielle pour
angular.element
:Si vous vous demandez pourquoi utiliser
document.querySelector()
, veuillez lire cette réponse .la source
var autocomplete = new google.maps.places.Autocomplete( $document[0].querySelector('#address'), { types: ['geocode'], componentRestrictions: {country: 'us'} } );
. Merci pour le conseil @kaiser. Pour une raison quelconque, l'api des cartes s'est plaint que ce que j'ai passé dans le premier paramètre n'était pas une entrée lorsque je l'ai utiliséangular.element(document.querySelector('#address'))
, mais tout va bien qui se termine bien.Vous devriez lire l' élément angulaire documentation de l' si vous ne l'avez pas encore fait, afin de comprendre ce qui est pris en charge par jqLite et ce qui n'est pas -jqlite est un sous-ensemble de jquery intégré à angular.
Ces sélecteurs ne fonctionneront pas avec jqLite seul, car les sélecteurs par identifiant ne sont pas pris en charge.
Alors, soit:
Edit: Notez que jQuery doit être chargé avant angularJS afin d'avoir la priorité sur jqLite:
Edit2: J'ai manqué la deuxième partie de la question avant:
Le problème avec
<input type="number">
, je pense que ce n'est pas un problème angulaire, c'est le comportement prévu de l' élément numérique html5 natif .Il ne retournera pas de valeur non numérique même si vous essayez de le récupérer avec jquery
.val()
ou avec l'.value
attribut raw .la source
est égal à
la source
Je ne pense pas que ce soit la bonne façon d'utiliser angular. Si une méthode framework n'existe pas, ne la créez pas! Cela signifie que le cadre (ici angulaire) ne fonctionne pas de cette façon.
Avec angular, vous ne devriez pas manipuler le DOM comme ceci (la manière jquery), mais utiliser une aide angulaire telle que
Ou créez votre propre directive (votre propre composant DOM) afin d'avoir un contrôle total dessus.
BTW, vous pouvez voir ici http://caniuse.com/#search=queryselector querySelector est bien pris en charge et peut donc être utilisé en toute sécurité.
la source
Si quelqu'un utilise gulp, il affiche une erreur si nous l'utilisons
document.getElementById()
et il suggère d'utiliser$document.getElementById()
mais cela ne fonctionne pas.Utilisation -
la source
Vous pouvez accéder aux éléments en utilisant $ document ($ document doit être injecté)
ou avec élément angulaire, les éléments spécifiés sont accessibles comme:
la source
Vous devez injecter $ document dans votre contrôleur et l'utiliser à la place de l'objet document d'origine.
Si vous n'avez pas besoin du wrap d'élément de style jquery, $ document [0] .querySelector ('# MyID') vous donnera l'objet DOM.
la source
Cela a bien fonctionné pour moi.
la source
Amélioration de la réponse de Kaiser:
N'oubliez pas d'injecter
$document
dans votre directivela source
find() - Limited to lookups by tag name
, il ne fonctionne pas sur ids. Vous avez également une fermeture supplémentaire)
.Peut-être que je suis trop tard ici mais cela fonctionnera:
Remarquez, il n'y a pas
appBusyIndicator
, c'est une valeur d'identification simple.Ce qui se passe dans les coulisses: (en supposant qu'il soit appliqué sur un div) (pris à partir de la ligne angular.js n °: 2769 et suivantes ...)
Par défaut, s'il n'y a pas de jQuery sur la page, jqLite sera utilisé. L'argument est compris en interne comme un id et l'objet jQuery correspondant est renvoyé.
la source
angular.element("#myId")
fonctionne bien.