Ng-Controller Örneği ile AngularJS Kontrolörleri

⚡ Akıllı Özet

AngularJS'de bir Controller, bir ekranın iş mantığını barındırır. Kapsam nesnesi aracılığıyla veri alır, işler ve sonucu görünüme geri sunar.ping Uygulama mantığından arındırılmış sunum işaretlemesi.

  • 🎯 Temel Sorumluluk: Denetleyici, kapsam nesnesini doldurur ve görünüme yöntemler sunar; DOM'u manipüle etmez.
  • 🔗 Kablolama: `ng-controller` yönergesi, adlandırılmış bir denetleyiciyi bir öğeye bağlar ve bu öğeye ve alt öğelerine denetleyici kapsamına erişim sağlar.
  • 🔁 Çift Yönlü Bağlama: `ng-model`, bir form alanını bir kapsam özelliğine bağlar; böylece görünümdeki düzenlemeler denetleyiciyi günceller ve bunun tersi de geçerlidir.
  • 🧩 Yöntem: Kapsama alanına eklenen fonksiyonlar, mantığın farklı parçalarını birbirinden ayırır ve görünüm ifadelerinden doğrudan çağrılabilir.
  • ???? ️ controllerAs Sözdizimi: Bir denetleyiciye takma ad verme ve ona bağlama this Denetleyiciler iç içe yerleştirildiğinde ortaya çıkan belirsizliği ortadan kaldırır.
  • 📁 ayırma: Denetleyicileri ayrı bir app.js dosyasına taşımak, görünüm katmanını mantık katmanından bağımsız hale getirir.

ng-controller ile AngularJS Denetleyicileri

AngularJS'de Denetleyici Nedir?

A kontrolör AngularJS'de, `Controller`, verileri `View`'dan alır, işler ve ardından bu verileri son kullanıcıya gösterilen `View`'a gönderir. `Controller`, temel iş mantığınızı barındırır. Veri modelini kullanır, gerekli işlemleri gerçekleştirir ve ardından çıktıyı `View`'a iletir.

⚠️ Sürüm notu: AngularJS (1.x dalı) 31 Aralık 2021 tarihinde kullanım ömrünün sonuna ulaştı ve artık güvenlik yamaları almıyor. Aşağıdaki kavramlar eski uygulamalar için hala geçerlidir; modern Angular'da aynı rolü bir denetleyici yerine bir bileşen sınıfı üstlenir.

Denetleyicinin ne olduğunu bilmek, akıllarda tek bir soruyu bırakıyor: Gerçekte görünümle nasıl iletişim kuruyor? Bir sonraki bölümde bu soruya cevap veriliyor.

Angular perspektifinden Controller'ın işlevi nedir?

Aşağıda bir AngularJS Controller'ın çalışma prensibinin basit bir tanımı verilmiştir:

AngularJS Controller'ın Çalışması
AngularJS Controller'ın Çalışması
  • Denetleyicinin birincil sorumluluğu görünüme iletilen verileri kontrol etmektir. Kapsam ve görünüm iki yönlü iletişime sahiptir.
  • Görünüm özellikleri ve olayları, kapsamdaki işlevleri çağırabilir. Aşağıdaki kod parçası bunu göstermektedir. fonksiyon($kapsam) Denetleyici ile birlikte tanımlanan ve dahili bir fonksiyon döndüren bir işlev. $scope.firstName hem de $scope.lastName katıldı. İçinde angularjsBir değişken olarak tanımlanan bir fonksiyon, bir Metottur.

AngularJS Controller'ın Çalışması

  • Veriler denetleyiciden kapsama alanına, ardından da kapsama alanı ve görünüm arasında gidip gelir.
  • Bu kapsam, modeli görünüme sunar. Model, görünümden gelen olaylar tarafından tetiklenen ve kapsam üzerinde tanımlanan yöntemler aracılığıyla değiştirilebilir.
  • Denetleyiciler DOM'u manipüle etmek için kullanılmamalıdır. Bu, diğer denetleyicilerin görevidir. direktifler.
  • En iyi uygulama, denetleyicileri işlevselliğe dayandırmaktır. Bir denetleyiciye ihtiyaç duyan bir giriş formunuz varsa, "form denetleyicisi" adında bir denetleyici oluşturun.

Mekanizma anlaşıldıktan sonra, bir sonraki bölümde boş bir sayfadan bir denetleyici oluşturulacaktır.

AngularJS'de Temel Denetleyici Nasıl Oluşturulur

Aşağıda AngularJS'de bir denetleyici (controller) oluşturma adımları verilmiştir.

Adım 1) Temel bir HTML Sayfası oluşturun

Bir denetleyici oluşturmadan önce, temel HTML sayfasının hazır olması gerekir. Aşağıdaki kod parçası, "Etkinlik Kaydı" başlıklı basit bir sayfadır ve şu referansı içerir: Bootstrap ve AngularJS.

AngularJS'de Temel Denetleyici Oluşturma

  1. Referanslar Bootstrap CSS stil sayfası, birlikte kullanılır. Bootstrap kütüphane.
  2. AngularJS kütüphanesine bir referans. Bundan sonra AngularJS ile yapılan her şey bu dosyadan çözümlenir.
  3. Bir referans Bootstrap Bu kütüphane, bazı kontrollerin duyarlı olmasını sağlar.

⚠️ Düzeltme: Orijinal kurulumda jQuery yüklendi ve AngularJS'nin ona bağımlı olduğu belirtildi. Ancak bu doğru değil. AngularJS, jQuery API'sinin yerleşik bir alt kümesi olan jqLite ile birlikte gelir ve yalnızca jQuery yüklendiğinde tam jQuery'ye yükseltilir. önce Bu referans kaldırıldı.

Adım 2) Dosyaları ve dosya yapısını kontrol edin

AngularJS'de Temel Denetleyici Oluşturma

  1. Dosyalar, geleneksel bir web uygulamasında olduğu gibi iki klasöre ayrılmıştır: stil sayfaları için "css" ve diğer dosyalar için "lib". JavaSenaryo dosyaları.
  2. bootstrap.css dosyası css klasöründe yer alır ve siteye görünümünü ve işlevselliğini kazandırır.
  3. angular.js, AngularJS sitesinden indirilen ve lib klasöründe saklanan ana kütüphanedir.
  4. app.js dosyası, denetleyiciler için gerekli kodları içerecektir.

Adım 3) Çıktıyı görüntülemek için AngularJS kodunu kullanın

Buradaki amaç, sayfa tarayıcıda açıldığında "AngularJS" kelimelerini hem düz metin olarak hem de bir metin kutusu içinde görüntülemektir.

AngularJS'de Temel Denetleyici Oluşturma

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName}}
</div>

<script src="lib/angular.js"></script>
<script>
var app = angular.module('DemoApp', []);

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "AngularJS";
}]);
</script>
</body>
</html>

Code Açıklama:

  1. ng-uygulaması Bu öğeyi bir AngularJS uygulamasının kökü olarak işaretler. Önekli öznitelikler ng- Bunlar yerleşik yönergelerdir. "DemoApp" uygulamaya verilen isimdir.
  2. Divan taşıyor ng-kontrolör "DemoController" adıyla, bu öğeye ve içindeki her şeye denetleyici kapsamına erişim izni verilir.
  3. ng modeli Bu kod, "Öğretici Adı" metin kutusunu kapsam özelliğine bağlayarak model bağlamasını oluşturur. tutorialName.
  4. modül DemoApp oluşturulur ve denetleyici, varsayılan değer olarak "AngularJS"i atar. tutorialName.

⚠️ Düzeltmeler uygulandı. Orijinal ilanda şu ifade yer alıyordu: chrset="UTF 8"Bu, ne geçerli bir öznitelik ne de geçerli bir kodlama adıdır ve AngularJS iki kez yüklendi — bir kez CDN'den, bir kez de başka bir kaynaktan. lib/angular.jsKütüphanenin iki kez yüklenmesi modül sistemini yeniden kaydeder ve öngörülemeyen davranışlara yol açar. Bağımlılık dizisi ek açıklaması ['$scope', function($scope){…}] Ayrıca bu özellik de eklendi; bu özellik olmadan dosya küçültüldüğü anda denetleyici bozuluyor.

Çıktı:

AngularJS'de Temel Denetleyici Oluşturma

Çünkü tutorialName “AngularJS” değeri atandığında, bu değer metin kutusunda ve düz metin satırında görünür. Tek bir özellik gösterim için yeterlidir; gerçek denetleyiciler genellikle davranışları da ortaya koyar, bu da bir sonraki bölümde ele alınmaktadır.

AngularJS Denetleyicilerinde Yöntemler Nasıl Tanımlanır

Normalde, iş mantığını ayırmak için bir denetleyicide birden fazla yöntem tanımlanır. Eğer denetleyici iki sayıyı toplamak ve çıkarmak zorunda kalsaydı.tracİki sayı için, her işlem için ayrı bir yöntem oluşturmanız gerekir.

Aşağıdaki örnek, bir AngularJS denetleyicisi içinde dize döndüren özel bir yöntem tanımlar.

AngularJS Denetleyicilerinde Yöntemleri Tanımlayın

<!-- The head and library references are unchanged from Step 3 -->
<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tName()}}
</div>

<script>
var app = angular.module('DemoApp', []);

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "AngularJS";

  // A method on the scope, callable from the view as tName()
  $scope.tName = function() {
    return $scope.tutorialName;
  };
}]);
</script>

Code Açıklama:

  1. Bir fonksiyon, kapsam nesnesine üye olarak eklenir. tNameBu, mevcut değeri döndürür. tutorialName.
  2. Görünüm, yöntemi şu şekilde çağırır: {{tName()}}Parantezler önemlidir: parantezler olmadan ifade, sonucu değil, fonksiyonun kendisini yazdırır.

⚠️ Düzeltme: orijinal okuma yöntemi $scope.tName = function() { return $scope.tName; };Bu fonksiyon, eğitim materyalinin adını değil, kendisini döndürüyordu; bu nedenle sayfa metin yerine fonksiyon gövdesini görüntülüyordu. Şimdi ise şunu döndürüyor: $scope.tutorialName.

Çıktı:

AngularJS Denetleyicilerinde Yöntemleri Tanımlayın

Şimdiye kadar her şey tek bir dosyada yer alıyordu. Üretim uygulamalarında denetleyiciler ayrı tutulur; bir sonraki bölümde de bu gösterilecektir.

Ng-Controller Örneği ile AngularJS Kontrol Cihazı

Yukarıdaki "HelloWorld" örneği, tüm işlevselliği tek bir dosyaya yerleştirmişti. Şimdi kontrolcü kodunu ayrı bir dosyaya taşımanın zamanı geldi.

) 1 Adım app.js dosyasına, denetleyiciniz için aşağıdaki kodu ekleyin.

Ng-Denetleyicili AngularJS Denetleyicisi

angular.module('app', [])
  .controller('HelloWorldCtrl', ['$scope', function($scope) {
    $scope.message = "Hello World";
  }]);

Yukarıdaki kod aşağıdakileri yapar:

  1. Denetleyiciyi barındıran "app" adlı bir modül tanımlar.
  2. “HelloWorldCtrl” adında bir denetleyici oluşturur ve bu denetleyici “Merhaba Dünya” mesajını görüntüler.
  3. Bu yöntem, denetleyiciden görünüme bilgi aktarmak için kapsam nesnesini kullanır; bu durumda, adı verilen bir değişken aktarılır. message.

) 2 Adım Sample.html dosyasına, ng-controller yönergesini ve üye değişkenine referansı içeren bir div ekleyin. message. Denetleyici kaynak kodunu içeren app.js dosyasına referans vermeyi unutmayın.

Ng-Denetleyicili AngularJS Denetleyicisi

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<h1> Guru99 Global Event</h1>
<div class="container">
<div ng-controller="HelloWorldCtrl">{{message}}</div>
</div>

<script src="lib/angular.js"></script>
<script src="app.js"></script>
</body>
</html>

⚠️ Düzeltme: app.js yüklenmelidir. sonra angular.js, çünkü çağırıyor angular.moduleOrijinal dosya da kütüphaneyi iki kez yükledi ve aynı içeriği taşıdı. chrset yazım hatası.

Çıktı:

Ng-Denetleyicili AngularJS Denetleyicisi

Şimdiye kadarki tüm örneklerde okuma ve yazma özellikleri doğrudan kullanılmıştır. $scopeAşağıdaki bölümde AngularJS ekibinin bunun yerine önerdiği alternatif ele alınmaktadır.

AngularJS'de controllerAs Söz Dizimi Nasıl Kullanılır?

Doğrudan bağlama $scope Çalışır, ancak denetleyiciler iç içe geçtiği anda belirsizleşir. Örneğin, bir görünüm ifadesi gibi. {{name}} Hangi kontrol cihazının sahibi olduğuna dair hiçbir ipucu vermiyor. nameVe alt kapsamlar üst kapsamlardan prototipik olarak miras aldığı için, miras alınan bir ilkel veri türüne yazan iç içe bir denetleyici, sessizce kendi gölge kopyasını oluşturur. controllerAs Sözdizimi, her denetleyiciye bir takma ad vererek her iki sorunu da ortadan kaldırır.

) 1 Adım Görünümdeki denetleyiciye aşağıdaki yöntemi kullanarak takma ad verin: as Anahtar kelimeyi seçin, ardından her bağlamanın başına bu takma adı ekleyin.

) 2 Adım Denetleyici içinde, özellikleri ekleyin. this yerine $scope.

<div ng-controller="DemoController as demo">
Tutorial Name : <input type="text" ng-model="demo.tutorialName">
This tutorial is {{demo.tutorialName}}
</div>

<script>
app.controller('DemoController', function() {
  // 'vm' is captured so nested functions keep the right reference
  var vm = this;
  vm.tutorialName = "AngularJS";

  vm.tName = function() {
    return vm.tutorialName;
  };
});
</script>

Üç kazanım elde edilir. Bağlamalar kendi kendini belgeleyen hale gelir, çünkü demo.tutorialName Sahibini adlandırır. Üst öğe takma adla belirtildiğinden, iç içe denetleyiciler artık çakışmaz. outer ve takma adla anılan bir çocuk inner her ikisi de açığa çıkarabilir nameDeğerler ayrıca, salt bir ilkel tür yerine bir nesne aracılığıyla bağlanır, böylece bir adım atılır.ping Çocuk süreçte yapılan bir düzenlemenin asla üst sürece yansımadığı tuzak.

👍 Bahşiş: Ele geçirmek this bir değişkene dönüştürmek gibi vm Denetleyicinin en üstünde. Bir geri çağırma işlevi içinde, this Bu, tamamen başka bir şeye işaret eder ve yakalanan referans, bağlamın doğru kalmasını sağlar.

Bağlama stilini seçmek bir karardır. Bir denetleyiciye neyin dahil olması gerektiğine karar vermek ise başka bir karardır ve aşağıdaki karşılaştırma bu çizgiyi çizmektedir.

AngularJS'de Controller ve Service Arasındaki Fark

Yeni başlayanlar sıklıkla denetleyiciyi (controller) bir servise ait olması gereken işlerle aşırı yüklerler. Aradaki fark ömür ve yeniden kullanılabilirliktir: bir denetleyici yalnızca görünümü ekranda olduğu sürece var olurken, bir servis uygulamanın ömrü boyunca yaşayan tekil bir nesnedir (singleton).

Görünüş kontrolör Hizmet
Ömür Görüş açısıyla yaratıldı ve yok edildi. Tüm uygulama için tek bir örnek.
Amaç Tek bir görünüm için verileri hazırlayın. Paylaşılan mantık, durum ve sunucu çağrıları
Yeniden kullanılabilir Hayır, görüşüne bağlı. Evet, her yere enjekte edilebilir.
Görüşler arasında durumu korur. Hayır, devlet navigasyonda kayboldu. Evet, durum devam ediyor.
Tipik içerik Kapsam özellikleri ve görünüm yöntemleri HTTP çağrıları, önbellekleme, iş kuralları

Denetleyicileri sade tutun. İki denetleyicinin aynı mantığa ihtiyacı varsa veya bir değerin görünümler arasında gezinme sırasında korunması gerekiyorsa, onu bir servise taşıyın ve bu servisi gerektiği yere enjekte edin. Pratik bir test, kodun mevcut ekran kapalıyken hala anlamlı olup olmadığını sormaktır. Cevap evet ise, kod bir servise aittir.

SSS

Evet. AngularJS, yönergeyi taşıyan her öğe için ayrı bir örnek ve ayrı bir kapsam oluşturur. Örnekler hiçbir durumu paylaşmaz, bu nedenle birindeki değişiklik diğerinde görünmez.

Denetleyici, yüklenen tüm bir görünümün parçası olduğunda bunu rotada belirtin. yönlendirmeSayfa içinde, mevcut rotadan bağımsız olarak görünen bir bileşen için `ng-controller` kullanın. İkisini birden asla bildirmeyin, aksi takdirde denetleyici iki kez çalışır.

Fonksiyonun önüne bağımlılık adlarını dizeler olarak listeleyen dizi ek açıklamasını kullanın. Küçültme işlemleri fonksiyon argümanlarını yeniden adlandırır ancak dize değişmezlerini asla değiştirmez, bu nedenle enjektör yine de $scope'u ve herhangi bir hizmeti doğru şekilde çözümler.

Evet. AI Yardımcılar, ekranın düz bir tanımından modül, denetleyici ve kapsam bağlamalarını oluşturur. Oluşturulan kod genellikle bağımlılık açıklamasını atladığı için, bağımlılık açıklamasını her zaman kontrol edin.

Yapay zeka araçları, kapsam atamalarını yakalanan bir sanal makine değişkeni üzerindeki özellikler olarak yeniden yazar ve eşleşen her görünüm bağlamasının başına takma adı ekler. Rev$watch çağrılarını ve olay dinleyicilerini elle inceleyin, çünkü bunlar hala scope nesnesini gerektiriyor.

Bu yazıyı şu şekilde özetleyin: