Angularjs Custom Directive Serisi-5 Direktif Kalıtımı

12 Eki
  1. Direktiflerin Tanımlanması
  2. Direktif Restriction Yapısı
  3. Scope Ayrımı
  4. Ayrılmış Scope Tarafına Erişim
  5. Direktif Kalıtımı (Inheritance)

Angularjs direktif serisinin beşinci bölümü direktiflerin kalıtımı(directive inheritance) hakkında olacak.

Direktif kalıtımı, mevcut bir direktifin özelliğini kullanarak yeni bir direktif oluşturmak istediğimizde kullanabileceğimiz bir özelliktir.

Direktiflerin kalıtımı controller birimlerinin paylaşımı şeklinde olmaktadır. Alt direktifler, üst direktiflerin controller nesnelerine erişebilir.

Bu durumu daha iyi özetlemek amacıyla bir örnek üzerinden devam edelim. Örnek uygulamamızda araçları temsil eden vehicle isimli bir ana direktif olsun. Otobüs ve taksiler birer araç olduğundan onları da alt direktifler olarak düşünebiliriz.

 
 <vehicle>
    <bus></bus>
    <car></car>
 </vehicle> 

Örnek uygulamamızda bus ve car direktifleri yolcu taşıyan araçları temsil etmektedir. Her araca yolcu bindiğinde vehicle isimli ana direktif üzerinde araçların toplam yolcu sayısının kaydı güncellenmektedir.

angular.module("app", [])
   .directive("vehicle", function(){
      return {
         restrict: "E",
         controller: function($scope){
           var self = this;

          self.totalPassenger = 0;
          self.loadPassenger = function(count){
               self.totalPassenger += count;
          }

          $scope.totalPassenger = function(){
              return self.totalPassenger;
          }
       }
     }
})

vehicle direktifinin self.loadPassenger() metodu, diğer alt direktifler tarafından yolcu sayısını güncellemek için kullanılacak olan metottur.

angular.module("app")
   .directive("bus", function(){
       return {
          restrict: "E",
          require: "^vehicle",
          scope: {},
          link: function(scope, element, ettributes, vehicleController)           {
              scope.dailyPassengersCount = 0;
 
              setInterval(function(){ 
                 scope.$apply(function(){
                    var loadedPassengers = Math.floor((Math.random() * 15) + 1)
                    scope.dailyPassengersCount += loadedPassengers;
                    vehicleController.loadPassenger(loadedPassengers);
                })
              }, 2000);
          },
          template: '<span>Bus Total Passengers: {{dailyPassengersCount}}</span>'
      }
 })

bus direktifine require:”^vehicle” eklemesi yapılarak bir üst direktifin vehicle olduğunu bildiriyoruz. Direktifin link() fonksiyonuna dikkat edecek olursak dördüncü parametresi vehicleController olarak belirlenmiştir. Bu controller, kalıtımı yapılan direktife ait controller nesnesidir.

bus direktifi 2 saniyede bir rastgele olarak yolcu sayısını arttırmaktadır. bus direktifi kendi günlük toplam yolcu sayısını arttırırken, bir üst direktif olan vehicle direktifinin de toplam yolcu sayısını güncellemektedir.

Aynı şekilde car direktifini de aşağıdaki gibi tanımlayabiliriz.

angular.module("app")
   .directive("car", function(){
      return {
        restrict: "E",
        require: "^vehicle",
        link: function(scope, element, ettributes, vehicleController) {
            scope.dailyPassengersCount = 0;
 
            setInterval(function(){ 
              scope.$apply(function(){
                 var loadedPassengers = Math.floor((Math.random() * 4) + 1);
                 scope.dailyPassengersCount += loadedPassengers;
                 vehicleController.loadPassenger(loadedPassengers);
              })
           }, 1500);
        },
        template: '<span>Car Total Passengers: {{dailyPassengersCount}}&</span>'
    }
 })

Çalışan uygulamayı şu şekilde görebiliriz.

Angularjs Custom Directive Serisi-4 Ayrılmış Scope Tarafına Erişim

9 Eki
  1. Direktiflerin Tanımlanması
  2. Direktif Restriction Yapısı
  3. Scope Ayrımı
  4. Ayrılmış Scope Tarafına Erişim
  5. Direktif Kalıtımı (Inheritance)

Angularjs direktif serisinin üçüncü bölümünde scope ayrımı üzerinde durmuştuk. Bu bölümde ise ayrılmış(isolated) scope bölgelerine dışarıdan erişimin nasıl yapılacağı üzerinde duracağız.

Bir direktifin scope ayrımını yaparken direktif nesnesine scope:{} şeklinde bir üye eklemesi yapılmaktadır. Bu durumda direktifin dış bağlantısı kesilir.  Ayrılmış direktiflerin dışındaki bir controller scope bölgesine veya başka bir direktifin scope bölgesine erişmek mümkün değildir. Ancak direktif tarafında belirlenen dış üyelere izinler verilerek onlara erişmek mümkündür. Bunu üç farklı şekilde yapabiliriz.

  • “@”
  • “=”
  • “&”

“@” scope erişimi

Direktif dışındaki bir değişkenin metinsel değerine erişmek için kullanılır.


Bu örnekte ColorController içerisinde tanımlanmış olan $scope.hex değişkeninin metin değerine ulaşılmıştır. Yani @ scope türü string değerlere erişimi sağlar.

Dikkat edecek olursak HTML tarafında kullanım <color hex=”{{hex}}”></color> şeklindedir.

“=” scope erişimi

Direktif dışındaki değişkenin kendisine erişmek için kullanılır.

Dikkat edecek olursak HTML tarafında kullanım <color hex=”hex”></color> şeklindedir. Yani metinsel değere erişim olmadığından “{{}}” şeklinde bir kullanım yapılmıyor.

“&” scope erişimi

Direktif dışındaki bir fonksiyona erişmek için kullanılır. Bir başka deyişle direktifin dışındaki bir controller scope üzerindeki fonksiyona direktif tarafından erişmek için kullanılır. Örneğin metin kutusuna tıklandığında rastgele renk kodu üreten bir direktif için aşağıdaki örneği inceleyebilirsiniz.

 

Angularjs Custom Directive Serisi-3 scope izolasyonu

8 Eki
  1. Direktiflerin Tanımlanması
  2. Direktif Restriction Yapısı
  3. Scope Ayrımı
  4. Ayrılmış Scope Tarafına Erişim
  5. Direktif Kalıtımı(Inheritance)

Angularjs direktif serisinin üçüncü bölümü direktiflerin scope ayrımı(isolate scope) hakkında olacaktır. scope ayrımı yapılırken iki önemli nokta vardır. Birincisi direktifin üst scope bölgelerinden ayrıştırılması. İkincisi direktiflerin ortak scope bölgelerinden ayrıştırılmasıdır.

1-Direktifin Üst scope Bölgelerinden Ayrıştırılması

Direktifler varsayılan olarak bir üst scope bölgesine erişebilecek şekilde ayarlanmıştır. Ancak her direktifin kendine ait bir scope bölgesi de vardır.

Bu direktif bir üst scope tarafından gelen location nesnesine ait bilgilere erişebilmektedir.

 <div ng-controller="LocationCtrl">
    <location></location>
</div>

Yani LocationCtrl içerisinde tanımlanan $scope.location nesnesine direktif tarafından doğrudan erişim sağlanabilmektedir. Bunu önlemek için direktif nesnesine scope:{} şeklinde bir tanımlama yapılır.

Artık LocationCtrl içerisinde tanımlanan $scope.location nesnesine direktif tarafından doğrudan erişilemez.

2-Direktifin Ortak scope Bölgelerinden Ayrıştırılması

Direktifler tanımlanırken data binding işlemi sırasında bir karışıklığa sebep olmamak adına scope ayrımını doğru yapılması gerekmektedir.

Örneğin renk kodlarını hexadecimal bir biçimde kullanıcıdan almayı amaçlayan  bir direktifimiz olsun.

Bu direktifi üç farklı renk için kullanmak istediğimizde aşağıdaki gibi bir durum ortaya çıkacaktır.

Adsız

Bir renk kutusuna bir değer girdiğimizde diğerleri de aynı değeri alıyor. Bunun sebebi hex değişkeninin two-way-binding yani çift yönlü bağlantısı yaptığı halde direktifin scope bölgesinin ayrılmamış olmasıdır. Direktifin scope bölgesini ayırmak için scope:{} şeklinde bir tanımlama yapılır.

Adsız

Bu şekilde her direktifi kendi scope bölgesinde çalışabilir hale getirmiş oluruz.

Dan Wahlin direktif scope ayrımı için durumu özetleyen bir grafik hazırlamış.

image_thumb_56FB9433 (1)

Bu grafiğe göre bir direktif bir üst controller’a ait scope bölgesine erişebiliyor ise shared yani paylaşılmış scope oluyor. Eğer erişemiyorsa isolated yani ayrılmış oluyor.

 

Angularjs Custom Directive Serisi-2 Direktif Restriction Yapısı

6 Eki
  1. Direktiflerin Tanımlanması
  2. Direktif Restriction Yapısı
  3. Scope Ayrımı
  4. Ayrılmış Scope Tarafına Erişim
  5. Direktif Kalıtımı (Inheritance)

Angularjs direktif serisinin ikinci bölümünde direktiflerin restrict üyesi üzerinde duruyor olacağız.

Adsız

Bir direktif için restriction tanımlaması onun görünüm tarafında ne şekilde kullanılacağının göstergesidir. Direktif nesnesinin dört farklı restrict şekli vardır.

  1. ‘A’ attribute türünde direktifler
  2. ‘E’ element türünde direktifler
  3. ‘C’ class türünde direktifler
  4. M‘ yorum türünde direktifler

1- Attribute (A) türünde direktif tanımlama

Bu tür direktifleri mevcut HTML elementler içerisinde direktif adını attribute şeklinde çağırarak kullanabiliriz. Örneğin uzun bir metnin 50 karakterlik kısmını gösterip geri kalanını “…” şeklinde kısaltarak gösteren örnek bir direktif hazırlayalım.

Direktifin adı truncate ve işlevi bir metnin 50 karakterini gösterip geri kalanını kırpmaktır. Kullanım şekli yukarıda HTML kısmında göründüğü gibi <p truncate /></p> şeklindedir.

2- Element (E) türünde direktif tanımlama

Element türündeki direktifleri mevcut bir HTML element içerisinde tanımlanmak zorunda değiliz. Bu direktiflerin kendisi HTML element gibi kullanılır. Örneğin bir lokasyon bilgisini longitude(boylam) ve latitude(enlem) şeklinde standartlaştırarak yazdıran bir direktif element türünde oluşturulabilir.

HTML kullanımı <location lon=”23.52″ lat=”42.12″></location> şeklindedir ve enlem boylam bilgileri değişken olarak belirtilmektedir. HTML attribute şeklinde belirtilen değişkenler direktifin scope üyesine aktarılmaktadır. Direktifin scope üyesine link fonksiyonundan erişilebilmektedir.

Direktiflerin link() fonksiyonunun parametreleri dependency injection yöntemiyle verilmez. Parametreler belli bir durum sırasına göre(positional) sıralanmıştır. Sıralama scope, attribute, element, controller şeklindedir.

3- Class (C) türünde direktif tanımlama

Direktifleri HTML elementlerinin class özelliklerini belirlemek için kullanabiliriz. Bu tür direktifler sadece class özelliği için çalışırlar. Örneğin 10 karakterden uzun metinleri kırmızı olarak işaretleyen bir direktif class türünde tanımlanabilir.

4- Comment (M) türünde direktif tanımlama

HTML tanımlaması içerisinde yorum satırı için tanımlanan direktif tipleridir. Yorum direktiflerinin tanımlanması diğer direktifler gibidir.

 app.directive("comment", function() {
    return {
        restrict: 'M',
        template: '<div>Yorum satırı...</div>'
    }
 })

Kullanım şekli de <! – – directive:comment – – > şeklindedir.

Direktifler için yukarıda tanımlanan 4 restrict özelliğinden en sık kullanılanlar element ve attribute şeklinde tanımlanan direktif türleridir.

Angularjs Custom Directive Serisi-1 Direktiflerin Tanımlanması

5 Eki

Direktifler Angularjs framework yapısı içerisindeki en önemli kavramlardan biridir. Direktifler HTML attribute ve elementler ile ulaşılabilen yeniden kullanılabilir ve test edilebilir kod blokları oluşturmayı sağlar.

Bu yazının konusu Angularjs direktifleri konusuna giriş niteliğinde olup, direktifler ile ilgili bir yazı dizisinin de başlangıcıdır. Bu yazı dizisinde kendi özel direktiflerimizi oluşturup kullanmayı ve direktiflerin detaylarına değineceğiz. Konu başlıkları genel olarak şu şekilde olacaktır:

  1. Direktiflerin Tanımlanması
  2. Direktif Restriction Yapısı
  3. Scope Ayrımı
  4. Ayrılmış Scope Tarafına Erişim
  5. Direktif Kalıtımı (Inheritance)

Özel direktiflerin tanımlanmasına geçmeden önce Angularjs bünyesinde bulunan başlıca direktifleri inceleyelim.

  • ng-show: Bir HTML elementinin gösterilmesini sağlar.
  • ng-hide: Bir HTML elementinin gizlenmesini sağlar.
  • ng-click: Bir HTML elementine tıklandığında çalışacak fonksiyonu gösterir.
  • ng-class: Bir HTML elementin class özelliğini belirler.
  • ng-style: Bir HTML elementin style özelliğini belirler.
  • ng-repeat: Bir HTML elementi tekrarlı bir sırayla yazar.

Örnek kullanım şekilleri:

 <button ng-show="isVisible"></button> 
 <button ng-hide="isSecret"></button> 
 <button ng-click="sendMessage()"></button> 
 <button ng-class="big-button"></button> 
 <utton ng-style="yellow"></button> 
 <button ng-repeat="item in socials"></button> 

Angularjs bünyesindeki bu direktiflerin ihtiyacımızı karşılamadığı durumlarda kendi özel direktiflerimizi oluşturabiliriz. Kendi özel direktiflerimizi oluştururken dikkat etmemiz gereken bazı kurallar vardır. Bu kurallar olmazsa olmaz katı kurallar olmaktan ziyade ilkesel olarak  benimsenmiş kurallardır. Örneğin direktiflerin isimlendirilmesi dikkat edilmesi gereken kurallardan biridir.

Direktifleri nasıl isimlendirmeliyiz?

Direktifler isimlendirilirken kullanıcıların okuduklarında kolayca anlayabilecekleri ve birbiri ile çakışmayan benzersiz ön ekler kullanmaya özen gösterilmelidir. Kendi özel direktiflerimizi kullanırken “ng-“ ön ekini kullanmamalıyız. Çünkü “ng-“ angular tarafından belirlenmiş özel bir ön ektir. Bunun yerine iki harf ile belirlediğimiz özel ön ekler kullanmayı tercih edebiliriz.

Direktiflerin javascript tarafındaki isimlendirme şekli Camel Casing şeklinde  yapılmaktadır. Örneğin javascript tarafında “mySocialButtons” gibi bir isimlendirme tercih edebiliriz.

angular.module("directives", [])
    .directive("mySocialButtons", [function(){..}]

Angularjs  HTML tarafından direktife erişirken, bu isimlendirmeyi küçük harfler ve her kelimenin arasına “-” karakteri kullanarak çağırmaya izin verir. Örneğin HTML tarafında “my-social-buttons” şeklinde direktifimizi çağırabiliriz.

 <my-social-buttons> </my-social-buttons>

Özel direktifleri ne zaman tercih etmeliyiz?

  • Tekrar tekrar kullanılabilir HTMl bileşenleri oluşturmak istediğimiz durumlarda kullanabiliriz.
  • Elementlere aynı davranışları vermek istediğimizde kullanabiliriz.
  • Bir jQuery plugin ile çalışmak istediğimiz durumda onu paketlemek için kullanabiliriz.
  • DOM ile etkileşime geçmek istediğimiz her zaman direktifleri kullanabiliriz. Controller, Service ve Factory gibi bölümlerden DOM elementlerine erişmek kötü bir yöntemdir. Çünkü kodun test edilebilirliğini azaltır ve kodu DOM’a bağımlı hale getirir.

Direktiflerin Tanımlanması

Direktiflerimizi oluşturmadan önce direktiflerin tutulacağı modülleri oluşturmalıyız. Bu ayrımın sebebi direktiflerin ana uygulama modülünden bağımsız ve test edilebilir özellikte olmasıdır. Ana modül içerisinde her şeyin tanımlanması karmaşık bir uygulamanın oluşmasına neden olacaktır. bu nedenle ana uygulamamızın bulunduğu modülü özel direktiflerimizi tanımlamak için kullanmamalıyız. Direktif modülünü uygulama modülüne sonradan yüklemeliyiz.

 

Örnek uygulamanın konusu, her web sitesinde karşılaştığımız sosyal medya butonlarını tekrar tekrar kullanabilmek için bir direktif haline getirmektir. Görüldüğü üzere ana modül app şeklinde isimlendirilmiştir. Direktifin tanımlanacağı modül directives adlandırılmış ve ana modüle sonradan yüklenmiştir. Eğer ana modül ile ilgili bir direktif oluşturacaksanız app modülüne bağlı bir şekilde tanımlamanızda bir mahsur yoktur.

Direktif fonksiyonu bir nesne döndürmektedir. Bu nesnenin bazı üyeleri vardır. Bu üyeler şu şekildedir:

  • restrict
  • scope
  • template veya templateUrl
  • link
  • controller

Direktifin restrict üyesi

Bu nesnenin restrict özelliği direktifin tipini belirler. Direktiflerin dört farklı tipi vardır. Bunlar:

  • ‘A’ attribute türünde direktifler
  • ‘E’ element türünde direktifler
  • ‘C’ class türünde direktifler
  • M‘ yorum türünde direktifler

Direktifin scope üyesi

Direktifin faaliyet alanını(scope) belirler.Direktifler veri bağlantısını kendi faaliyet alanlarından(scope) alabilecekleri gibi direktif dışındaki bir direktiften veya controller’dan da sağlayabilir.

Direktifin template üyesi

Direktifler DOM üzerine yerleştiklerinde görüntülenmek isteniyorsa HTML tanımlamaları yapılmalıdır. HTML tanımlaması düz metin şeklinde yapılabileceği gibi dışarıdaki bir *.html dosyaya templateUrl ile erişilerek de yapılabilir. Yukarıdaki örnekte templateUrl kullanılmıştır.

Direktifin link üyesi

Direktifin link() fonksiyonu direktifin DOM elementi ile temasa geçtiğinde yani uygulama yüklendiğinde çalışır. DOM içerisinde her direktif örneği (instance) için bir kez çalışır. Bunu test etmek için link() fonksiyonu içerisine console.log(“work”) yazabilirsiniz. Konsola sadece bir kez “work” yazdığını gözlemlyebilirsiniz.

Direktiflerin link() fonksiyonunun parametreleri dependency injection yöntemiyle verilmez. Parametreler belli bir durum sırasına göre(positional) sıralanmıştır. Sıralama scope, attribute, element, controller şeklindedir.

Direktifin controller üyesi

Bir direktif eğer dışarıdan veri almaya ihtiyaç duymuyorsa yani sadece görünüm(view) taraflı bir yaklaşımı varsa bu tür direktifler görünüme dayalı (view oriented) olarak düşünülebilir. Bunlar basit direktiflerdir. Ancak kendi verisini kendi temin edebilen direktifler oluşturmak isteniyorsa ki bu tür direktifler veriye dayalı (data-oriented) direktiflerdir. Bu tür direktiflere controller üyeleri eklenir. Bir controller ile direktifin servisler aracılığı ile dışarıdan kendi verisini alması sağlanabilir. Eğer mantıksal iş kuralları varsa yine controller içerisinde tanımlanabilir.

Eğer bir direktif görünüm tarafı ve kontrol tarafı ile bütünleşik olarak tanımlanmış ise bu tür direktifler component ya da widget diye adlandırılabilir. Direktifleri yazının en başında bahsettiğim kadar önemli kılan şey, ihtiyaç duyduğu bir çok özelliği bünyesinde taşıyabiliyor olmasıdır.

Angularjs 2.0 ve sonrası için direktifler daha da önemli hale gelecek. Çünkü artık tek başına controller yapılarının olmadığı yeni bir sürüm yolda gibi görünüyor.

Webstorm smartest javascript IDE

1 Eki

Jetbrains ürünleri bir geliştiricinin alet çantasında olması gereken başlıca araçlardandır. Bu yazıda frontend geliştirme aracı olan Webstorm ürününden bahsedeceğiz.

Webstorm sloganı “smartest javascript IDE” yani “akıllı javascript IDE” şeklindedir. Bu sloganın hakkını verdiği kanısındayım. Javascript dili özelliklerini tanıması ve birçok javascript framework için intellisense özelliği barındırması, kodlarken bize büyük bir kolaylık sağlamaktadır.

scr_main_01

Webstorm ile client-side tarafında Javascript, CSS ve HTML gibi diller desteklenirken, server-side tarafında Node.js dili ile geliştirme yapabilirsiniz.

Neden Kullanmalıyız?

  • Akıllı Geliştirme Ortamı Sunar: Kodlama yaparken projenizi tanır, anlar ve bize daha rahat bir geliştirme ortamı oluşturur. Örneğin JQuery, Angularjs veya bootstap kullanıyorsak IDE bu framework’leri otomatik olarak tanıyarak bize yardımcı olur. Çalışma esnasında hata algılama, refactoring ihtiyacı olan kod bölümlerini gösterme ve gelişmiş navigasyon özellikleri sayesinde kaliteli kod üretmemizi sağlar.
  • En Son Teknolojileri Destekler:En popüler teknolojileri destekler. JQuery, Angularjs, ECMAscript 6 gibi teknolojilere destek verir.
  • Bütünleştirici ve Tamamlayıcı Destekler: Proje geliştirirken ihtiyaç duyulan Debugger, VCS(versiyon kontrol sistemleri), Terminal, Deployment gibi özellikleri ve geniş eklenti deposu sayesinde başka bir ürüne ihtiyaç duymadan iş akışlarını düzgün bir şekilde tamamlayabilirsiniz.
  • Platform Genişliği: Windows, Linux ve Mac OS gibi işletim sistemlerinde tek bir lisans ile çalışma imkanı sunar.

Webstorm Özellikleri Nelerdir?

  • Code Completion: Projenizi analiz ederek fonksiyonlar, metodlar, modüller, değişkenler ve sınıflar için en iyi şekilde bütünleşik bir tecrübe sunar.

javascript_code_completion@2x

  • Navigation: Projeniz ne kadar büyü olursa olsun bir değişkenin nerede tanımlandığını, ToDo listelerinizi ve dosyalarınızı kolayca bulabilirsiniz. Değişkenleri, sınıfları ve fonksiyonları arayabilir tanımlandıkları yerlere ulaşabilirsiniz.

search_everywhere@2x

  • Code Quality: Kod kalitesini arttırmaya yönelik kod iyileştirici uyarılar verir. Kodun yeniden yapılandırması gereken noktalarda uyarılar verir.

javascript_warning@2x

  • Code Style: Kullandığınız programlama diline göre kod biçimlendirmesi yapar.

code_style_preferences@2x

  • Multiple Selection: Birden fazla seçim özelliği ile düzenleme işlemlerinin kolayca yapılmasını sağlar.

select_occurrences@2x

  • Debugging Javascript and Node.js: Javascript ve Node.js geliştirmeleri sırasında Google Chrome için debugging imkanı sunar.
  • Unit Testing: Javascript ve Node.js birim testlerini yazmayı destekler. Karma test çalıştırma aracı ile Javascript testlerinizi ve Mocha ile Node.js testlerinizi çalıştırabilirsiniz.

mocha_test_results@2x

  • Grunt and Gulp: Aynı arayüzde konsola ihtiyaç duymadan Grunt ve Gulp görevlerini çalıştırma imkanı sunar.

gulp_integration@2x

  • npm: node modüllerini kolayca yönetebilirsiniz.
  • Code Quality Tools: Webstorm kendi kod kontrolleri dışında JSHint, ESLint gibi ekstra araçları da kullanarak kod kalitesini kontrol edebilirsiniz.
  • vcs: Git, SVN, Mercurial ve Perforce gibi birçok versiyon kontrol sistemi ile Webstorm arayüzünden çalışabilirsiniz.

vcs@2x

  • Built in terminal: Kendi terminal penceresi sayesinde işletim sisteminin terminal penceresine ihtiyaç duymadan çalışabilirsiniz.

Fiyat performans açısından oldukça üstün bir IDE deneyimi sunan bu üründür. Öğrenciler için ücretsiz olarak sunulmaktadır.