2013-10-28 8 views
11

AngularJS-Direktiven haben ng-, die ihnen vorangestellt sind. Warum besteht es darauf, ein Präfix zu verwenden, anstatt einen tatsächlichen XML-Namespace zu verwenden?Warum empfiehlt AngularJS die Verwendung von XML-Namespaces nicht?

Von AngularJS's documentation:

Wenn Sie die alten Stil Direktive Syntax ng verwenden: dann sind xml-Namensraum in html IE glücklich zu machen. (Dies ist hier aus historischen Gründen, und wir nicht mehr Gebrauch von ng empfehlen :.)

mit so etwas wie dies zu funktionieren scheint:

<html xmlns:ng="http://angularjs.org" ng:app="my-app"> 

wie aus this jsFiddle ersichtlich ist.

Aber es empfiehlt nicht, es zu verwenden und unterstützt es nur aus historischen Gründen. Kann mich jemand auf diese Gründe hinweisen? Aus einem Flex-Hintergrund kommend, denke ich, XML-Namespaces sind großartig und ich würde sie gerne nutzen, aber vielleicht gibt es starke Gründe für Angular, mit dem Präfix-Ansatz zu gehen?

+0

Dies ist neugierig auf AngularJS mit SVG, weil SVG einen XML-Parser verwendet. Zum Beispiel, data-* und ng-* sind in SVG nicht legal (so manche Browser erlauben es). Ng: * ist legal in SVG. http://stackoverflow.com/questions/15532371/do-svg-docs-support-custom-data-attributes –

Antwort

4

Ich habe mich selbst darüber gefragt. Betrachten Sie zwei unabhängige Projekte, "Widget Factory" und "Wombat Framework", die jeweils die Direktive x entwickeln. Es ist preferred practice, Direktiven-Namen mit Präfixen zu versehen, um Namespace-Konflikte zu vermeiden, aber in diesem Fall könnte jeder noch immer einen wf-x definieren.

Was passiert, wenn ich <div wf-x="something"></div> in einer Anwendung verwende, die beide Module enthält? Interessanterweise verbindet eckig beide und verbindet jede in absteigender Reihenfolge. Aber die Wahrscheinlichkeit, dass ein korrektes Ergebnis erzielt wird, ist gering. Angular wird einen Fehler verursachen, wenn beide Direktiven versuchen, einen Controller hinzuzufügen, und die Semantik der beiden Direktiven und was sie für den Wert des Attributs und der Struktur des Elements erwarten, könnten leicht miteinander in Konflikt geraten.

In XML wird dieses Problem mit Namespaces gelöst. <div xmlns:wf1="..." wf1:x="something"></div> oder <wf1:x xmlns:wf1="..."></wf1:x> sind nicht schön, aber sie beschreiben eindeutig, welche Richtlinie wir verwenden möchten.

Warum unterstützt dieser Winkel nicht? XML-Namespaces sind ungewöhnlich und werden im allgemeinen HTML möglicherweise nicht gut unterstützt, und beim Parsen können technische Probleme auftreten. Direktiven werden in Kommentaren und CSS-Klassen sowie Elementen und Attributen unterstützt, und : müsste irgendwie in einem Klassennamen manipuliert werden. Die einfachste Antwort könnte jedoch sein, dass es noch kein allgemein genug Problem ist, etwas fortgeschritteneres als die Präfixe zu verlangen, die wir heute verwenden. Es ist anzumerken, dass der derzeitige Ansatz des Winkels der von Web Components empfohlene Ansatz ist. Wenn sich dieser Standard entwickelt, würde ich erwarten, dass er eckig nachverfolgt. Es gibt somediscussion zu diesem Thema auch in der Polymer-Gruppe.

+0

Ausgehend von der Flexibilität der Attributbenennung rate ich, dass Angular Namespace-bewusst nicht analysiert, sondern stattdessen eine Textumwandlung auf den voll qualifizierten Attributnamen vornimmt, Trennzeichen wie ":" entfernt und camelCasing anwendet.Sie empfehlen wahrscheinlich gegen ng: weil es dazu führen könnte, dass Sie Namespaces verwenden können, wie XML sie definiert. –

4

Auf die Gefahr, Glib zu klingen, weil eckig auf die Erweiterung der HTML-Funktionalität statt auf XML ausgerichtet ist?

+1

Hmm, das macht Sinn. HTML5 ist auch keine reine Obermenge von XML. – Himanshu