Bir AngularJS direktifi nedir?


181

AngularJS belgelerini ve birkaç öğreticiyi okumak için oldukça fazla zaman harcadım ve belgelerin ne kadar ulaşılamaz olduğuna oldukça şaşırdım.

AngularJS almak isteyen başkaları için de yararlı olabilecek basit, cevaplanabilir bir sorum var:

Bir AngularJS direktifi nedir?

Bir yerde direktifin basit ve kesin bir tanımı olmalı, ancak AngularJS web sitesi şu şaşırtıcı derecede yararsız tanımları sunmaktadır:

Ana sayfada :

Yönergeler, AngularJS'de bulunan benzersiz ve güçlü bir özelliktir. Yönergeler, uygulamanıza özgü yeni HTML sözdizimini icat etmenizi sağlar.

In geliştirici belgelerinde :

Yönergeler HTML'ye yeni numaralar öğretmenin bir yoludur. DOM sırasında derleme yönergeleri HTML ile eşleştirilir ve yürütülür. Bu, direktiflerin davranışı kaydetmesine veya DOM'u dönüştürmesine izin verir.

Ve bir dizi görüşme var ironik bir şekilde, izleyicilerin ne olduklarını zaten anladıklarını varsayan yönetmelikler hakkında var.

Herkes, açık bir referans için, direktifin ne olduğunu açıklayan kesin bir tanım sunabilir mi?

  1. Nedir (jQuery'nin açık tanımına bakın örnek olarak )
  2. Hangi pratik problemleri ve durumları ele almayı amaçlamaktadır
  3. Hangi tasarım modelini veya alternatif olarak AngularJS'nin iddia edilen MVC / MVW misyonuna nasıl uyduğunu gösterir .

2
Beni ... bir örnek olarak jQuery'nin açık tanımını gördünüz.
joshuamabina

Stack Overflow'da 2012'de nasıl olduğundan emin değilim, ancak bu soruyu gözden geçirdim ve “açısal yönerge” etiketini ekledim. Onun etiket bilgileri aslında oldukça net bir tanımını vermektedir. Ayrıca, geliştirici dokümanlar ikinci alıntı bulamadığımı fark ettim
user4642212

Yanıtlar:


142

Nedir (örnek olarak jQuery'nin açık tanımına bakın)?

Bir yönerge esasen , Açısal derleyici onu DOM'da bulduğunda çalışan bir işlev işlevidir . İşlev (ler) neredeyse her şeyi yapabilir, bu yüzden bir direktifin ne olduğunu tanımlamanın oldukça zor olduğunu düşünüyorum. Her direktifin bir adı vardır (ng-repeat, sekmeler, kendi makyajınız gibi) ve her direktif bir yorumda nerede kullanılabileceğini belirler: eleman, nitelik, sınıf, yorumda.

Bir direktif normalde sadece (post) bağlantı fonksiyonuna sahiptir. Karmaşık bir yönerge derleme işlevi, bağlantı öncesi işlevi ve bağlantı sonrası işlevi içerebilir.

Hangi pratik problemleri ve durumları ele almayı amaçlıyor?

Direktiflerin yapabileceği en güçlü şey HTML'yi genişletmektir. Uzantılarınız, uygulamanızı oluşturmak için Alana Özel Bir Dil'dir (DSL). Örneğin, uygulamanız çevrimiçi bir alışveriş sitesi çalıştırıyorsa, HTML'yi "alışveriş sepeti", "kupon", "özel" vb. Yönergelere sahip olacak şekilde genişletebilirsiniz. " "div" ve "span" yerine çevrimiçi alışveriş "alan adı (@WTK’da daha önce bahsedildiği gibi).

Yönergeler ayrıca HTML'yi bileşenlendirebilir - bir grup HTML'yi yeniden kullanılabilir bazı bileşenlerde gruplandırabilir. Kendinizi çok sayıda HTML çekmek için ng-include kullanarak bulursanız, büyük olasılıkla yönergelere yeniden bakmanın zamanı gelmiştir.

Hangi tasarım modelini somutlaştırıyor veya alternatif olarak, açısaljların iddia edilen MVC / MVW misyonuna nasıl uyuyor?

Yönergeler, DOM'yi değiştirdiğiniz ve DOM olaylarını yakaladığınız yerdir. Bu nedenle direktifin derleme ve bağlantı fonksiyonlarının her ikisi de "element" i bağımsız değişken olarak alır. Yapabilirsin

  • yönergeyi değiştirmek için bir grup HTML (yani bir şablon) tanımlayın
  • olayları bu öğeye (veya alt öğelerine) bağlama
  • sınıf ekle / kaldır
  • metin () değerini değiştirme
  • aynı öğede tanımlanan özniteliklerde değişiklik olup olmadığına dikkat edin (aslında özniteliklerin izlendiği değerlerdir - bunlar kapsam özellikleridir, dolayısıyla yönerge değişiklikler için "modeli" izler)
  • vb.


HTML biz gibi şeyler var <a href="...">, <img src="...">, <br>, <table><tr><th>. A, href, img, src, br, table, tr ve th öğelerinin ne olduğunu nasıl tanımlarsınız? Direktif budur.


2
Mark, teşekkürler. Bunun açık ve muhtemelen doğru bir cevaba en yakın olduğunu düşünüyorum. Bence direktifler her zaman html etiketlerine bağlı değil mi? Bu yüzden, bir direktifin HTML etiketine bağlı bir işlev olduğunu söylemek daha doğru olabilir. Bu nedenle, HTML dilinin bildirici olarak genişletilmesine izin verir.
20'de tohster

Bir yorumda direktif kullanılabilir, bu nedenle tüm direktiflerin bir HTML etiketine bağlı olması gerekmez. Örneğin,<!-- directive: my-directive exp -->
Mark Rajcok

Mark, bu bir direktifin alışılmadık kullanımı mı olurdu? yani direktifler HTML'yi genişletmek için geleneksel olarak kullanılır ve amaçlanır.
12'de

9
Tamam şimdi daha iyi anladım. Bunu düşünmenin bir yolu: 1. DSL'ler genellikle sözdizimi ağaçlarını temsil eder 2. HTML DOM bir DSL sözdizimi ağacıdır, ancak katı bir ağaçtır: etiketler çoğunlukla katı bir şekilde tasarlanmış ve amaçlanmıştır ve genişletilemez. 3. AngularJS ve direktif mekanizması, geliştiricilerin özel ağaç düğümleri oluşturmalarına izin vererek HTML DOM'u daha esnek hale getirir. Bu düğümler yeni davranışları veya mevcut davranışların (alt ağaçlar)
4'ünü

1
@MarkRajcok Son paragrafınızla mücadele ediyorum. Düz <div></div>bir direktif midir? Evet dedin. Ancak burada dekorasyon yoktur (eleman, sınıf, yorum, öznitelik yoluyla) .Buradaki insanlar bunların bir HTML DOM için yeniden işaretçiler olduğunu söylüyorlar . Açıklayabilir misin ? (Düz bir öğe için bir yönerge oluşturabileceğiniz neden hakkında konuşmuyorum <div>)
Royi Namir

11

Belki açısal direktifler için gerçekten basit ve ilk bir tanım

AngularJS yönergeleri (ng-yönergeleri), Angular tarafından HTML'yi genişletmek için kullanılan bir ng önekine (ng-model, ng-app, ng-repeat, ng-bind) sahip HTML özellikleridir. ( from: W3schools açısal öğretici )

Bunun bazı örnekleri

Ng uygulama yönergesi, angularjs uygulaması tanımlar.

Ng model yönergesi uygulama verilerine HTML denetimleri (giriş, seçin metin alanı) değerini bağlanır.

Ng-bağlama HTML görünümüne yönergesi bağlandığı uygulama verileri.

<div ng-app="">
    <p>Name: <input type="text" ng-model="name"></p>
    <p ng-bind="name"></p>
</div>

Bu öğreticiyi kontrol edin, en azından benim için Angular'ın en iyi tanıtımlarından biriydi. Daha eksiksiz bir yaklaşım @ mark-rajcok'un daha önce söylediği her şey olacaktır.


4

Belgelere bakıldığında, direktifler, nesneler ve davranışlar oluşturmak için angularjs ayrıştırabileceğiniz yapılardır. widget'ınız (bileşen) yapılandırılmıştır, nasıl davranır ve verilerle nasıl beslenir. Angularjs daha sonra bu direktiflere aykırı bunları çalışan html / javascript koduna çevirmek için .

Yönergeler oradadır, böylece uygun semantiği kullanarak daha karmaşık bileşenler (widget'lar) oluşturabilirsiniz. Angularjs direktifleri örneğine bir göz atın - sekme bölmesini tanımlarlar (bu normal HTML'de elbette geçerli değildir). Daha sonra bir sekme bölmesi gibi görünecek şekilde tasarlanmış yapı oluşturmak için div-s veya yayılma gibi kullanmaktan daha sezgiseldir .


Biraz daha az teknik açıklama olduğunu düşündüğümü ekledim.
raam86

1
Teşekkürler bu oldukça yararlı. Belki de bir bileşeni kapsülleyen, onu özellikler ve davranışlarla tanımlayan, somutlaştırılabilen ve kendini DOM ile ifade edebilen bir tür dinamik şablon (OO programlama sınıfına benzer) olarak düşünebilirim? Ve var olmasının nedeni (javascript nesnesi veya html şablonu ile karşılaştırıldığında) HTML etiketlerinin daha dinamik, nesne benzeri davranışlar almasına izin vermektir, böylece OO türü programlamada manipüle edilebilir hale gelebilir mi?
9'da tohster

Evet ve hayır. Direktiflerin var olmasının nedeninin OO programlamasında manipüle edilebilir olmaları ile ilgisi olduğunu söyleyemem . Aslında çerçeveye tüm angularjs yaklaşımı, OO Javascript kodunu yazmaktan ziyade HTML ve rastgele DOM düğümleri öznitelikleriyle büyük ölçüde ilişkili hissediyor. Bu havayı angularjs'in günlük problemleri nasıl çözdüğüne dair tüm örneklere bakıyorum. Direktiflerin arkasındaki temel nedenin davranışları ve verileri semantik olarak yapılandırılmış bir bileşene gömmek için yol olması olduğunu söyleyebilirim .
WTK

3

AngularJS Yönergelerinde, AngularJS'nin HTML derleyicisine ($) söyleyen bir öznitelik (restrict-A), element adı (restrict-E), comment (restrict-M) veya CSS sınıfı (restrict - C) gibi bir HTML DOM öğesi için html re işaretleri bulunur. derleme), bu DOM öğesine belirli bir davranış uygulamak veya hatta DOM öğesini ve alt öğelerini dönüştürmek.Bazı Örnek ng-bind, ng-hide / show vb.


2

Ana sayfa bu konuda çok açık: Son bölümdeki sekmelerin üzerine geldiğinizde:

HTML kelimelerini özel bir tabs öğeyle genişlettik . tabsSekmelerin oluşturma için gerekli kompleks HTML yapısını ve davranışını soyutlar. Sonuç, daha okunabilir bir görünüm ve çok kolay bir şekilde yeniden kullanılabilir sözdizimidir. "

Sonra bir sonraki sekmede:

angular.module('components', []).
  directive('tabs', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      controller: function($scope, $element) {
        var panes = $scope.panes = [];

        $scope.select = function(pane) {
          angular.forEach(panes, function(pane) {
            pane.selected = false;
          });
          pane.selected = true;
        }

Böylece html elemanlarını icat edebilir tabsve bu elemanların oluşturulmasını açısal olarak ele alabilirsiniz.


2
Hızlı cevabınız için teşekkür ederim! Yani bir direktifin amacı, özel etiketler ve nitelikler oluşturarak HTML kelimelerini genişletmektir? "MVW" den çok daha geniş bir sorun kapsamına değinmiş gibi görünse de, bu oldukça güçlü görünüyor. BTW başkaları da aynı fikirde olmayabilir, ancak bir sayfanın en altına inip sonra köprülü bir kelimenin üzerine gelip bir kez 'yönerge' kelimesinden bahsetmeyen bir açılır araç ipucu okumanın tam olarak bir " çok açık "direktifin tanımı. Bununla birlikte, hızlı tepkiyi gerçekten takdir ediyorum.
9'da tohster

Evet! Yaptıkları bu kemanı kontrol edebilirsiniz. Gerçek html, html bölmesindeki açıktan farklıdır.
raam86
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.