Açısal Yönergenin Genişletilmesi


114

Bir 3. taraf yönergesinde (özellikle Angular UI Bootstrap ) küçük bir değişiklik yapmak istiyorum . Sadece kapsamına eklemek istiyorumpaneDirektifin :

angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
  // various methods
}])
.directive('tabs', function() {
  return {
    // etc...
  };
})
.directive('pane', ['$parse', function($parse) {
  return {
    require: '^tabs',
    restrict: 'EA',
    transclude: true,
    scope:{
      heading:'@',
      disabled:'@' // <- ADDED SCOPE PROPERTY HERE
    },
    link: function(scope, element, attrs, tabsCtrl) {
      // link function
    },
    templateUrl: 'template/tabs/pane.html',
    replace: true
  };
}]);

Ama aynı zamanda Angular-Bootstrap'i Bower ile güncel tutmak istiyorum. Koşar koşmazbower update , değişikliklerimin üzerine yazacağım.

Öyleyse, bu yönergeyi bu çardak bileşeninden ayrı olarak nasıl genişletebilirim?


2
En temiz yol kullanmaktır $provide.decorator(), aşağıdaki cevabıma bakın.
Eliran Malka

Yanıtlar:


96

Muhtemelen bunu çözmenin en basit yolu, uygulamanızda üçüncü taraf yönergesi ile aynı ada sahip bir yönerge oluşturmaktır. Her iki yönerge de çalışır ve priorityözelliği kullanarak çalıştırma sıralarını belirleyebilirsiniz (daha yüksek öncelik ilk önce çalışır).

İki yönerge kapsamı paylaşır ve yönergenizin linkyöntemi aracılığıyla üçüncü taraf yönergesinin kapsamına erişebilir ve bunları değiştirebilirsiniz .

Seçenek 2: Ayrıca, bir üçüncü taraf yönergesinin kapsamına, kendisiyle aynı öğeye rastgele adlandırılmış kendi yönergenizi koyarak da erişebilirsiniz (her iki yönergede de yalıtım kapsamı kullanılmadığı varsayılır). Bir öğedeki tüm yalıtılmamış kapsam yönergeleri kapsamı paylaşır.

Daha Fazla Okuma: https://github.com/angular/angular.js/wiki/Dev-Guide%3A-Understanding-Directives

Not: Önceki cevabım, bir yönergeyi değil, bir üçüncü taraf hizmetini değiştirmek içindi.


3
teşekkürler @ sh0ber, bu tam olarak ihtiyacım olan şey. Ve önceki cevabınız bana da yardımcı oldu, re: 3rd parti hizmetleri.
Kyle

Hey, bu cevap gerçekten çok iyi, ancak yönergelerin "öncelik" özelliği hakkında herhangi bir belge bulamıyorum. Bulduğum tek şey, "onu kullanabilirsin" yazan ancak bunun gerçek bir örneğini bulamadığım bir haberdi.
Ciel

2
Yönerge API bilgi görünüşte taşındı @Ciel $compiledoc burada
Dan

60

TL; DR - demo ver!


     Big Demo Button     
 


Üçüncü tarafın direktifini süslemek için $provide's' i kullanın decorator().

Bizim durumumuzda, direktifin kapsamını şu şekilde genişletebiliriz:

app.config(function($provide) {
    $provide.decorator('paneDirective', function($delegate) {
        var directive = $delegate[0];
        angular.extend(directive.scope, {
            disabled:'@'
        });
        return $delegate;
    });
});

İlk olarak, paneyönergeyi Directiveilk argüman olarak birleştirilerek adını ileterek dekore etmeyi isteriz, sonra onu geri çağrı parametresinden alırız (bu adla eşleşen bir dizi yönergedir).

Elimize geçtikten sonra, kapsam nesnesini alabilir ve gerektiğinde genişletebiliriz. Tüm bunların configblokta yapılması gerektiğine dikkat edin .

Bazı notlar

  • Aynı ada sahip bir direktifin eklenmesi ve ardından öncelik düzeyinin ayarlanması önerilmiştir. Anlamsız olmasının yanı sıra (ki bu bir kelime bile değil , biliyorum…) sorunlar ortaya çıkarır , örneğin üçüncü taraf direktifinin öncelik seviyesi değişirse?

  • JeetendraChauhan, bu çözümün 1.13 sürümünde çalışmayacağını iddia etti (yine de test etmedim).


1
@ sh0ber'ın cevabına bir şans vermenizi öneririm (sadece olay yaymak için başka bir yönerge oluşturun).
Eliran Malka

2
Bu cevapla ilgili kısa bir not (harika çalışıyor), 'paneDirective'deki' Direktif'in bir amacı var ;-) Bunu anlamam biraz zaman aldı: stackoverflow.com/questions/19409017/… , kabul edilene bakın Cevap.
Roy Milder

2
merhaba @EliranMalka plunker'ımı kontrol et plnkr.co/edit/0mvQjHYjQCFS6joYJdwK umarım bu birine yardımcı olur
Jeetendra Chauhan

1
Bağlantısı decorator()kesildi ( docs.angularjs.org/api/auto/service/$provide#decorator olarak güncellendi )
Chris Brown

1
@EliranMalka yes, v1.3'te bindToControllertanıtıldı. Ancak bunun alternatif bir çözüm olarak görülmemesi gerektiğini unutmayın, bu yalnızca orijinal direktifin bindToControllermülkle ayarlandığı belirli bir durum içindir . İyi fikir, bunu bir cevap olarak
göndereceğim

8

Bu, sorunuzun doğrudan cevabı olmasa da, http://angular-ui.github.io/bootstrap/ en son sürümünün (ana sürüm) sekmeleri devre dışı bırakmak için destek eklediğini bilmek isteyebilirsiniz . Bu özellik şu şekilde eklenmiştir: https://github.com/angular-ui/bootstrap/commit/2b78dd16abd7e09846fa484331b5c35ece6619a2


Uyarılar için +1. bunu bildiğim iyi oldu. sanırım bower'ın açısal önyüklemesi ve angular-ui'nin önyükleme bileşeni eşzamanlı değil.
Kyle

6

Orijinal yönergeyi değiştirmeden genişleten yeni bir yönergeyi oluşturduğunuz başka bir çözüm

Çözüm, dekoratör çözümüne benzer:

Yeni bir yönerge oluşturun ve genişletmek istediğiniz yönergeyi bağımlılık olarak enjekte edin

app.directive('extendedPane', function (paneDirective) {

  // to inject a directive as a service append "Directive" to the directive name
  // you will receive an array of directive configurations that match this 
  // directive (usually only one) ordered by priority

  var configExtension = {
     scope: {
       disabled: '@'
     }
  }

  return angular.merge({}, paneDirective[0], configExtension)
});

Bu şekilde orijinal yönergeyi ve genişletilmiş sürümü aynı uygulamada kullanabilirsiniz


2
Bu harika, bir izolat kapsam yönergesini kendi değişkenlerimle genişletmek için tam da ihtiyacım olan şey !! Angular.extend'in nesneleri derinlemesine kopyalamadığını buldum, bu nedenle bu, paneDirective'in kapsam nesnesini bununla değiştirir. Bir alternatif, orijinal kapsamı PaneDirective'den koruyacak ve burada tanımlanan değişkenleri ekleyecek / birleştirecek olan angular.merge'dir.
mathewguest

1
evet, angular.mergekullanılmış olmalıydı, örneği güncelleyeceğim
kidroca

1

Burada,bindToController özelliğe sahip bir yönergeye bağlamaları genişletmenin farklı bir senaryosu için başka bir çözüm var .

Not: Bu, burada sunulan diğer çözümlere bir alternatif değildir. Yalnızca orijinal direktifin kurulduğu belirli bir durumu (diğer yanıtlarda ele alınmayan) çözer bindToController.

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.