Ich verwende die "Angularised" -Version des Spin-Steuerelements, wie hier dokumentiert: http://blog.xvitcoder.com/adding-a-weel-progress-indicator-to-your-angularjs-application/
Eines der Dinge, die ich an der gezeigten Lösung nicht mag, ist die Verwendung von jQuery im Service, mit dem die Spinsteuerung effektiv an das DOM-Element angehängt wird. Ich würde es vorziehen, eckige Konstrukte zu verwenden, um auf das Element zuzugreifen. Ich möchte auch vermeiden, die ID des Elements, an das der Spinner innerhalb des Dienstes anhängen muss, "fest zu codieren", und stattdessen eine Direktive verwenden, die die ID im Dienst (Singleton) so festlegt, dass andere Benutzer des Dienstes oder Der Service selbst muss das nicht wissen.
Ich kämpfe mit dem, was angle.element uns gibt, und dem, was document.getElementById auf derselben Element-ID uns gibt. z.B. Das funktioniert:
var target = document.getElementById('appBusyIndicator');
Nichts davon tut:
var target = angular.element('#appBusyIndicator');
var target = angular.element('appBusyIndicator');
Ich mache eindeutig etwas, das ziemlich offensichtlich falsch sein sollte! Kann jemand helfen?
Angenommen, ich kann das oben genannte zum Laufen bringen, habe ich ein ähnliches Problem beim Versuch, den jQuery-Zugriff auf das Element zu ersetzen: zB $(target).fadeIn('fast');
funktioniert
angular.element('#appBusyIndicator').fadeIn('fast')
oder angular.element('appBusyIndicator').fadeIn('fast')
nicht
Kann mich jemand auf ein gutes Beispiel für eine Dokumentation verweisen, die die Verwendung eines Angular- "Elements" gegenüber dem DOM-Element verdeutlicht? Angular "umschließt" das Element offensichtlich mit seinen eigenen Eigenschaften, Methoden usw., aber es ist oft schwierig, den ursprünglichen Wert zu erhalten. Wenn ich zum Beispiel ein <input type='number'>
Feld habe und auf den ursprünglichen Inhalt zugreifen möchte, der in der Benutzeroberfläche sichtbar ist, wenn der Benutzer "-" (ohne Anführungszeichen) eingibt, erhalte ich nichts, vermutlich weil "type = number" bedeutet, dass Angular ablehnt Die Eingabe, obwohl sie in der Benutzeroberfläche sichtbar ist und ich sie sehen möchte, damit ich sie testen und löschen kann.
Alle Hinweise / Antworten geschätzt.
Vielen Dank.
Antworten:
Es kann so funktionieren:
Sie verpacken den
Document.querySelector()
nativen Javascript- Aufruf in denangular.element()
Aufruf. Sie erhalten das Element also immer in einem jqLite- oder jQuery- Objekt, je nachdem, objQuery
es verfügbar / geladen ist oder nicht .Offizielle Dokumentation für
angular.element
:Falls Sie sich fragen, warum Sie es verwenden sollen
document.querySelector()
, lesen Sie bitte diese Antwort .quelle
var autocomplete = new google.maps.places.Autocomplete( $document[0].querySelector('#address'), { types: ['geocode'], componentRestrictions: {country: 'us'} } );
. Danke für den Tipp @kaiser. Aus irgendeinem Grund beschwerte sich die Maps-API, dass das, was ich im ersten Parameter übergeben habe, keine Eingabe war, als ich es verwendeteangular.element(document.querySelector('#address'))
, aber alles ist gut, das endet gut.Sie sollten die Winkel lesen Element docs , wenn Sie noch nicht haben, so können Sie verstehen , was mit jqLite unterstützt wird und was nicht -jqlite eine Teilmenge von Jquery in Winkel gebaut ist.
Diese Selektoren funktionieren nicht nur mit jqLite, da Selektoren nach ID nicht unterstützt werden.
Also entweder :
Bearbeiten: Beachten Sie, dass jQuery vor angleJS geladen werden sollte, um Vorrang vor jqLite zu haben:
Edit2: Ich habe den zweiten Teil der Frage schon einmal verpasst:
Das Problem mit
<input type="number">
, ich denke, es ist kein Winkelproblem, es ist das beabsichtigte Verhalten des nativen HTML5-Zahlenelements.Es wird kein nicht numerischer Wert zurückgegeben, selbst wenn Sie versuchen, ihn mit jquery's
.val()
oder mit dem raw-.value
Attribut abzurufen .quelle
entspricht
quelle
Ich denke nicht, dass es der richtige Weg ist, Winkel zu verwenden. Wenn es keine Framework-Methode gibt, erstellen Sie sie nicht! Dies bedeutet, dass das Framework (hier eckig) nicht auf diese Weise funktioniert.
Mit Angular sollten Sie DOM nicht wie folgt manipulieren (auf die jquery-Art), sondern einen Angular Helper wie z
Oder erstellen Sie Ihre eigene Direktive (Ihre eigene DOM-Komponente), um die volle Kontrolle darüber zu haben.
Übrigens können Sie hier sehen, http://caniuse.com/#search=queryselector querySelector wird gut unterstützt und kann daher sicher verwendet werden.
quelle
Wenn jemand schluckt, zeigt es einen Fehler, wenn wir verwenden,
document.getElementById()
und es wird empfohlen, zu verwenden$document.getElementById()
aber er funktioniert nicht.Verwenden -
quelle
Sie können mit $ document auf Elemente zugreifen ($ document muss injiziert werden)
oder mit einem Winkelelement kann auf die angegebenen Elemente zugegriffen werden als:
quelle
Sie sollten $ document in Ihren Controller einfügen und anstelle des Originaldokumentobjekts verwenden.
Wenn Sie den Zeilenumbruch des jquery-Stilelements nicht benötigen, erhalten Sie mit $ document [0] .querySelector ('# MyID') das DOM-Objekt.
quelle
Das hat bei mir gut funktioniert.
quelle
Verbesserung der Antwort von Kaiser:
Vergessen Sie nicht,
$document
in Ihre Richtlinie einzufügenquelle
find() - Limited to lookups by tag name
, funktioniert es nicht mit IDs. Sie haben auch einen zusätzlichen Abschluss)
.Vielleicht bin ich zu spät hier, aber das wird funktionieren:
Beachten Sie, dass es keinen
appBusyIndicator
einfachen ID-Wert gibt.Was passiert hinter den Kulissen: (vorausgesetzt, es wird auf ein Div angewendet) (ab Angular.Js Zeile Nr. 2769 ...)
Wenn auf der Seite keine jQuery vorhanden ist, wird standardmäßig jqLite verwendet. Das Argument wird intern als ID verstanden und das entsprechende jQuery-Objekt wird zurückgegeben.
quelle
angular.element("#myId")
funktioniert gut.