ng-app vs. data-ng-app, was ist der Unterschied?


230

Ich schaue mir gerade dieses Start-Tutorial-Video anangular.js

Zu einem bestimmten Zeitpunkt (nach 12'40 ") gibt der Sprecher an, dass die Attribute ng-appund data-ng-app=""innerhalb des <html>Tags mehr oder weniger gleichwertig sind , ebenso wie ng-model="my_data_bindingund data-ng-model="my_data_binding". Der Sprecher sagt jedoch, dass der HTML-Code je nach Attribut durch verschiedene Validatoren validiert wird gebraucht.

Können Sie den Unterschied zwischen den beiden Möglichkeiten erklären, ng-Präfix gegen data-ng-Präfix?


Antworten:


403

Gute Frage. Der Unterschied ist einfach - es gibt absolut keinen Unterschied zwischen den beiden, außer dass bestimmte HTML5-Validatoren einen Fehler auf eine Eigenschaft wie ng-appwerfen, aber sie werfen keinen Fehler für etwas, dem ein Präfix data-wie vorangestellt ist data-ng-app.

Um Ihre Frage zu beantworten, verwenden data-ng-appSie , wenn Sie möchten, dass die Validierung Ihres HTML-Codes etwas einfacher ist.

Unterhaltsame Tatsache: Sie können auch x-ng-appden gleichen Effekt erzielen.


4
Würde das Datenpräfix jemals verhindern, dass ein ng-Attribut ordnungsgemäß funktioniert? (zB "data-ng-repeat")?
Tonejac

3
Es scheint eine solche Verschwendung von CPU-Zyklen zu sein, manuell zu entfernen data-und x-. Warum können die HTML-Validierungsregeln nicht geändert werden, um ng-Inhalte zu akzeptieren ?
DaveAlger


1
@ DaveAlger: Es ist eine schlechte Idee, das zu tun, was du gesagt hast. Wenn es draußen viele berühmte Tools wie Angular mit unterschiedlichen Präfixen gibt, möchten Sie, dass HTML allen folgt, um ihr Präfix hinzuzufügen?!?! Wie Krumia sagte, ist es der Weg, HTML zu erweitern.
Dassi Orleando

65

Aus der Angularjs-Dokumentation

Angular normalisiert den Tag- und Attributnamen eines Elements, um zu bestimmen, welche Elemente mit welchen Anweisungen übereinstimmen. Wir verweisen normalerweise auf Anweisungen mit ihrem zwischen Groß- und Kleinschreibung beachteten Namen für camelCase (z. B. ngModel). Da bei HTML die Groß- und Kleinschreibung nicht berücksichtigt wird, wird auf Direktiven im DOM durch Kleinbuchstaben verwiesen, wobei normalerweise durch Bindestriche getrennte Attribute für DOM-Elemente verwendet werden (z. B. ng-Modell).

Der Normalisierungsprozess ist wie folgt:

Entfernen Sie x- und data- von der Vorderseite des Elements / der Attribute. Konvertieren Sie den durch:, - oder _ getrennten Namen in camelCase. Hier sind einige äquivalente Beispiele für Elemente, die mit ngBind übereinstimmen:

basierend auf der obigen Aussage sind alle gültigen Richtlinien

1. ng-bind
2. ng: bind
3. ng_bind
4. data-ng-bind
5. x-ng-bind


Dies geschieht jedoch nur, um den Namen der Direktive zu vergleichen. Das tatsächliche Attribut wird nicht geändert.
RetroCoder

3
Gut zu wissen über die -,: und _ Notation
Code Whisperer

29

Der Unterschied liegt in der Tatsache, dass benutzerdefinierte data-*Attribute in der HTML5-Spezifikation gültig sind . Wenn Sie also möchten, dass Ihr Markup validiert wird, sollten Sie sie anstelle der ngAttribute verwenden.


1
Ich verstehe aus der Spezifikation, dass data- * funktionieren würde, da es nur das HTML validiert. Aber warum sollte x- * dann funktionieren? Es gibt keine Beschreibung dazu in der Spezifikation.
Bhramar

1
x- * ist für die Verwendung durch den Browser reserviert. In Bezug auf Ihre Frage, WARUM x funktioniert, funktioniert beides als Winkel, um sicherzustellen, dass es für beide Daten / x funktioniert, indem es in das Framework codiert wird. Wenn Sie fragen, warum x für Winkel funktioniert, ist das eine weitere Debatte. Dafür gibt es gute Argumente. Siehe diese Antwort auf SO: stackoverflow.com/a/17902387/339803 Die andere Antwort auf dieser Seite scheint zu denken, dass x für XHTML ist, aber ich bin nicht sicher. Sehen Sie, was Sie daraus machen können, nachdem Sie alles gelesen haben. Die HTML5-Spezifikation besagt auch, dass Browser / Anbieter verwendet werden: w3.org/html/wg/drafts/html/master/single-page.html
redfox05

15

Kurze Antwort:

ng-modelund data-ng-modelsind gleich und gleichwertig!


Warum?

  1. Grund für: data- Präfix Die
    HTML5-Spezifikation erwartet, dass jedem benutzerdefinierten Attribut ein Präfix vorangestellt wird data-.

  2. Grund für: beide ng-modelund data-ng-modelsind gleich und gleichwertig.

AngularJS-Dokument - Normalisierung

Angular normalisiert den Tag- und Attributnamen eines Elements, um zu bestimmen, welche Elemente mit welchen Anweisungen übereinstimmen. Wir verweisen normalerweise auf Direktiven mit ihrem zwischen Groß- und Kleinschreibung beachteten Namen für camelCase (z ngModel. B. ). Da bei HTML die Groß- und Kleinschreibung nicht berücksichtigt wird, wird auf Direktiven im DOM durch Kleinbuchstaben verwiesen, wobei normalerweise durch Bindestriche getrennte Attribute für DOM-Elemente verwendet werden (z ng-model. B. ).

Der Normalisierungsprozess ist wie folgt:
1. Entfernen Sie x-und data-von der Vorderseite des Elements / der Attribute.
2. umrechnen :, -oder _separierten Namen camelCase.

Beispielsweise
Die folgenden Formulare sind alle gleichwertig und stimmen mit der ngBind-Direktive überein:

<div ng-controller="Controller">
  Hello <input ng-model='name'> <hr/>
  <span ng-bind="name"></span> <br/>
  <span ng:bind="name"></span> <br/>
  <span ng_bind="name"></span> <br/>
  <span data-ng-bind="name"></span> <br/>
  <span x-ng-bind="name"></span> <br/>
</div>

2

Sie können data-ng- anstelle von ng- verwenden, wenn Sie das HTML Ihrer Seite gültig machen möchten.


2
Das OP versteht, dass sie austauschbar sind, möchte aber wissen, warum die beiden verfügbar sind, wenn sie "gleich" arbeiten. Ich glaube, eine Erklärung, was sie unterscheidet, wäre eine wertvollere Antwort.
Charles Watson

1

Wenn Sie HTML- oder HTML-Fragmente auf Ihrem Server bearbeiten möchten, bevor Sie sie an den Browser senden, möchten Sie auf jeden Fall data-ng-xxx-Attribute anstelle von nur ng-xxx-Attributen verwenden.

  1. Es macht Ihr HTML gültig, was bedeutet, dass es von HTML-Parsern (serverbasiert) wie Domdocument (PHP) oder anderen verwendet werden kann. Diese Parser versagen oft auf nicht gut geformtem HTML.
  2. Angular normalisiert das Attribut, aber denken Sie daran, dass dies auf dem Client und nicht auf dem Server erfolgt.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.