Angular kullanarak resim kaydırma çubuğu öğesi oluşturma

Angular kullanarak resim kaydırma çubuğu öğesi oluşturma

Bu codelab hakkında

subjectSon güncelleme Eki 20, 2020
account_circleYazan: aayush

1. Giriş

Misafir yazar tarafından Aayush Arora

Angular Elements, özel öğeler olarak paketlenmiş Açılı Bileşenlerdir. Bunlar şu anda Chrome, Opera ve Safari tarafından desteklenmektedir ve çoklu tarayıcılar aracılığıyla diğer tarayıcılarda kullanılabilir. Bu öğeler, ortak Angular Arayüzü ve Değişiklik Algılama Stratejisi ile Açısal Altyapının tamamından yararlanabilir. Kaydedildikten sonra bu öğeler tarayıcıda kullanılabilir.

Bu codelab, kendi resim kaydırmalı açısal bileşeninizi oluşturma konusunda size yol gösterecektir. Daha sonra, bunu Angular Framework dışında çalışabilmesi için köşeli bir öğeye dönüştürebilirsiniz.

Oluşturacağınız uygulama

Bu codelab'de, açılımları kullanarak resim kaydırma çubuğu derleyeceksiniz. Öğeniz:

  • Tarayıcıdaki bir HTML öğesi gibi çalışır
  • DOM'a hitap eden tüm çerçevelere takılabilir.

Neler öğreneceksiniz?

  • Resim kaydırma çubuğu özel bileşeni oluşturma
  • Resim kaydırma çubuğu özel bileşenini özel öğeye dönüştürme
  • Bileşen, tarayıcı içinde çalışacak şekilde nasıl paketlenir?

Gerekenler

Bu codelab, Angular Nesnelerine odaklanmaktadır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için kullanımınıza sunulmuştur.

2. Hazırlanma

Kodu İndirme

Bu codelab'in tüm kodunu indirmek için aşağıdaki bağlantıyı tıklayın:

İndirilen ZIP dosyasını paketten çıkarın. Bu işlem, kök klasörünü ((angular-element-codelab-master)) içeren bir paketi açar

İki klasör (image-slider) ve (image-slider-finished). Tüm kodlama çalışmalarımızı, resim kaydırma çubuğu adlı bir dizinde gerçekleştireceğiz.

Projeyi çalıştırma

Projeyi çalıştırmak için kök dizinden ( ng-serve ) komutu çalıştırmanız gerekir ( image-slider ).

Uygulama önyüklendikten sonra şunları görebilirsiniz:

19ffd082e2f024a5.png

3. Resim Kaydırma Çubuğu özel bileşeni mi yapılıyor?

Resim kaydırma çubuğu nasıl oluşturulur?

Bu resim kaydırma çubuğu için, açılı ayraç kullanarak düğmeleri bağlayın. Resimler, alt etiketler, bağlantılar vb. içeren bir dizi nesne oluştururuz. Bu resimleri bir kapsayıcıda birbirinin altına yerleştirir ve kapsayıcıyı tıklama yoluyla çeviririz.

Bir resim kaydırma çubuğu bileşeni oluşturup, ardından bunu köşeli bir öğeye dönüştüreceğiz.

  • Resimler ve başlıklar için kapsayıcı.
  • Verileri içeren bir dizi
  • Verileri bağlamak için şablon

4. Resim kaydırma çubuğu bileşenini uygulama

Bir projeye başlamanın birden çok yolu vardır. Bu örnekte, projemizi mümkün olduğunca basit tutmak ve Angular Elements'e odaklanmak için css ile birlikte temel kodu da paylaştık.

Dizi ve veri hizmeti oluşturma

Kaydırıcı Dizisinin şunları içereceğini unutmayın:

  • Kaydırma çubuğunda resim URL'si için img anahtarı
  • Resim için alternatif sağlamak amacıyla bir alt etiketi
  • Resimle ilgili açıklamanın yer aldığı metin

src/assets dizininizde bulunan data.json dosyası şu şekilde görünmelidir.

sliderArray = [
 
{img: 'http://bloquo.cc/img/works/1.jpg', alt: '', text: '365 Days Of weddings a year'},
 
{img: 'http://bloquo.cc/img/works/2.jpg', alt: '',  text: '365 Days Of weddings a year'},
 
{img: 'http://bloquo.cc/img/works/3.jpg', alt: '', text: '365 Days Of weddings a year'},
 
{img: 'http://bloquo.cc/img/works/4.jpg', alt: '',  text: '365 Days Of weddings a year'},
 
{img: 'http://bloquo.cc/img/works/5.jpg', alt: '', text: '365 Days Of weddings a year'}
];

Bu verileri hizmet kullanarak bileşenimize getirmemiz gerekir. data.service.ts dosyasına, yukarıda belirtilen diziden verileri almak için @angular/common/http modülünden httpClient modülünü kullanarak bir getData() yöntemi yazacağız.

 
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'

const URL = '../assets/data.json';

@Injectable({
 providedIn
: 'root'
})
export class DataService {

 constructor
(private http: HttpClient) {}

 getData
() {
   
return this.http.get(URL)
 
}
}

Veri hizmetinden veri alma

Hizmetimizi bileşenin içine aktarmamız gerekiyor ve ardından nesneyi data.json nesnesinden almak için gözlemlenebilir kanala abone olabiliriz.

Bunun için üç adım uygulamamız gerekir:

  • Bileşen dizisi başlatılıyor
  • getData() işlevi tarafından döndürülen Gözlemlenebilir öğesine abone olma
  • Gözlemlenebilir gruba abone olduktan sonra verileri kontrol etmek için bir arayüz Sonuç oluşturun.
  • Verileri bileşen dizisine atayın.

Bileşen Dizisini Başlatma

Bir nesne dizisi olan slider.component.ts içindeki bileşen dizisini bildirip başlatırız:

Beyan etmek için:

sliderArray: object[];

Başlatmak için:

constructor(private data: DataService) {
 
this.sliderArray = [];
}

Ardından, hizmeti oluşturucunun içine aktarıp başlatmamız gerekir.

constructor(private data: DataService) {}

Artık hizmetimizi kullanmaya ve hizmet yöntemlerimizi çağırmaya hazırız.

Veri Hizmeti'nden veri alma

Verileri hizmetten çıkarmak için getData() yöntemini çağıracak ve dönecek olan gözlemlenebilir durumuna gözlemleyeceğiz. Ayrıca doğru verileri alıp almadığımızı kontrol etmek için bir arayüz de oluşturacağız.Result,

Bu işlemi ngOnInit yöntemiyle gerçekleştireceğiz:

this.data.getData().subscribe((result: Result)=>{
})

Bileşen Dizisine veri atama

Sonunda, veriler bileşen dizisine atanır:

this.data.getData().subscribe((result: Result)=>{  
 
this.sliderArray = result.sliderArray;
})

Bileşen dizimizin içindeki verileri aldıktan sonra şablonumuzu bu verilere bağlayabiliriz.

slider.component.html, içinde zaten bir HTML şablonumuz var. Sonraki adımımız bu şablonu sliderArray ile bağlamaktır.

5. Verileri şablona bağlama

*ngFor Yönergesi'ni kullanarak verileri şablona bağlarız ve son olarak kaydırma çubuğunun çalışması için şablona dönüşümler ekleriz.

Bu, üç adım içerir:

  • sliderArray şablona bağlanıyor
  • Kaydırma düğmeleri için Etkinlik Bağlantısı ekleme
  • ngStyle ve ngClass kullanılarak css dönüşümleri ekleniyor

Slayt Dizisini Bileşene Bağlama

img-container, a text-container ve a slider. içeren bir kapsayıcı var

*ngFor yönergesini kullanarak üç kapsayıcıdaki verileri birleştiririz

<div class="container">
 
<div class="img-container" *ngFor="let i of sliderArray; let select = index;">
   
<img src="{{i.img}}" alt="{{i.alt}}" >
 
</div>

 
<div>
   
<div class="text-container">
     
<div class="page-text" *ngFor="let i of sliderArray;let select = index;">
       
<h3>{{i.text}}</h3>
     
</div>
   
</div>
 
</div>

</div>

<div class="slider">
 
<div class="slide-button-parent-container" *ngFor="let i of sliderArray; let x =index">
   
<div class="select-box">
     
<div class="slide-button">
     
</div>
   
</div>
 
</div>
</div>

Slayt Dizisi için Etkinlik Bağlantısı

Veriler birleştirildikten sonra tıklama etkinliğini, açılı click binding kullanarak her bir slayt düğmesine bağlarız. selected(x) adında bir işlev oluşturacağız. Burada x dizinin dizinidir.

selected(x) {
 
this.downSelected(x);
 
this.selectedIndex = x;
}

downSelected
(i) {
 
this.transform =  100 - (i) * 50;
 
this.selectedIndex = this.selectedIndex + 1;
 
if(this.selectedIndex > 4) {
   
this.selectedIndex = 0;
 
}
}

Dikkat edilmesi gereken noktalar:

  • Aşağı seçilen işlev, dönüşüm özelliğinin değeri, selected işlevi tıklandığında iletilen dizinin elli katı azalır.
  • Bu mantık, metin kapsayıcıyı %100, %50, -%50, -%100 olarak çevirir ve dört farklı duruma sahiptir.

ngStyle & ngClass kullanarak CSS dönüşümleri ekleme

Başlangıçta tüm görüntüler, sıfır opaklık değerleriyle ayarlanır ve seçilen dizin, resim dizinine eşit olduğunda ngClass directive kullanılarak selected sınıfı eklenir. Bu selected sınıfı, resme kullanıcı için opaklık ekler. Böylece resim kullanıcıya görünür hale gelir.

<div class="img-container"  *ngFor="let i of sliderArray; let select = index;"
      [
ngClass]="{'selected': select == selectedIndex}">
</div>

Ardından, metin kapsayıcıyı select() işlevi kullanılarak hesaplanan transform değerine göre çeviririz.

<div [ngStyle]="{'transform': 'translateY('+ transform + '%' +')', 'transition': '.8s'}">
</div>

Bu adımların tümünü gerçekleştirdikten sonra, aşağıda verilen nihai kodu öğrenebilirsiniz:

<div class="container">
 
<div class="img-container"  *ngFor="let i of sliderArray; let select = index;"
      [
ngClass]="{'selected': select == selectedIndex}">
   
<img src="{{i.img}}" alt="{{i.alt}}" >
 
</div>

 
<!--</div>-->
 
<div [ngStyle]="{'transform': 'translateY('+ transform + '%' +')', 'transition': '.8s'}">
   
<div class="text-container">
     
<div class="page-text" *ngFor="let i of sliderArray;let select = index;" [ngClass]="{'selected': select == selectedIndex}">
       
<h3>{{i.text}}</h3>
     
</div>
   
</div>
 
</div>

</div>

<div class="slider">
 
<div class="slide-button-parent-container"  *ngFor="let i of sliderArray; let x =index" (click)="selected(x)" >
   
<div class="select-box">
     
<div   class="slide-button" [ngClass]="{'slide-button-select': x == selectedIndex}" >
     
</div>
   
</div>
 
</div>
</div>

6. Bileşeni açılı öğeye dönüştürme

Bu işlem beş adımdan oluşur:

  • Açılı Öğe için Shadow DOM kullanılıyor
  • entryComponents yararlanın
  • @angular/elements modülünden CreateCustomElement modülü içe aktarılıyor ve kullanılıyor
  • custom-element tanımlayın
  • ngDoBootstrap Yöntemi Çalışıyor

Açısal öğe için Gölge DOM'u kullanma

Artık resim kaydırma çubuğumuz var, onu Angular Element hale getirmemiz gerekiyor.

İşin eğlenceli yanı, bileşen DOM'u (gölge DOM'u) yapmak için yalnızca küçük bir değişiklik yapmak.

ViewEncapsulation modülünü içe aktarmamız ve buradan ShadowDom yöntemini kullanmamız gerekiyor.

@Component({
 selector
: 'app-slider',
 templateUrl
: './slider.component.html',
 styleUrls
: ['./slider.component.css'],
 encapsulation
: ViewEncapsulation.ShadowDom
})

loginComponents'tan yararlanma

Giriş Bileşeni, ölçülü şekilde yüklenen bir bileşendir. Bir giriş bileşenini, NgModül'de önyükleme yoluyla belirtirsiniz.

Burada, SliderComponent içinde, @NgModule içindeki entryComponents dizisinde belirteceğiz

@NgModule({
 declarations
: [
   
SliderComponent
 
],
 imports
: [
   
BrowserModule,
   
HttpClientModule
 
],
 entryComponents
: [SliderComponent],
})

createCustomElement Modülünü içe aktarma ve kullanma

Burada, @angular/elements. tarafından sağlanan createCustomElement Modülünü kullanmamız gerekir. createCustomElement işlevinde parametre olarak SliderComponent, kullanmanız gerekir. Daha sonra, slider öğesini DOM'ye kaydetmemiz gerekir.

import { createCustomElement } from '@angular/elements';

export class AppModule {
 constructor
(private injector: Injector) {
   
const slider = createCustomElement(SliderComponent, { injector });
   
}
}

Kaydırıcıyı DOM öğesi olarak kaydetmek için customElements.define yöntemini kullanarak tanımları yaparız.

customElements.define('motley-slider', slider);

Son olarak, ngDoBootstrap() yöntemini kullanarak bu özel öğeyi kaldırmamız gerekir. Kodun tamamı şöyle görünür:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, Injector } from '@angular/core';
import { createCustomElement } from '@angular/elements';
import { SliderComponent } from './slider/slider.component';
import { HttpClientModule} from "@angular/common/http";

@NgModule({
 declarations
: [
   
SliderComponent
 
],
 imports
: [
   
BrowserModule,
   
HttpClientModule
 
],
 entryComponents
: [SliderComponent],
})
export class AppModule {
 constructor
(private injector: Injector) {
   
const slider = createCustomElement(SliderComponent, { injector });
   customElements
.define('motley-slider', slider);
 
}

 ngDoBootstrap
() {}

}

Angular Öğesini Paketleme

package.json komutumuzu yeni komutlarımızla değiştirmemiz gerekiyor. package.json nesnesinin içindeki komut dosyası nesnesini değiştireceğiz.

Değiştirilen komut dosyası nesnemizi kontrol edelim:

"scripts": {
 
"ng": "ng",
 
"start": "ng serve",
 
"build": "ng build --prod --output-hashing=none",
 
"package": "cat dist/my-app/{runtime,polyfills,scripts,main}.js | gzip > elements.js.gz",
 
"serve": "http-server",
 
"test": "ng test",
 
"lint": "ng lint",
 
"e2e": "ng e2e"
}

Şimdi ng build & ng package komutunu çalıştırabiliriz. Son olarak, build komutu kullanılarak oluşturulan dist/klasörü sunmak için ng sunumunu çalıştıracağız. Ayrıca, ng package komutundan alınan gzip öğesini kullanabilir ve çıkarıp npm module olarak yayınlayabiliriz.