Angular Bootstrap and Jquery Component, Http Client, Services, Declaration, Routing

{Kamil Kaplan} ®
Kodcular
Published in
8 min readSep 5, 2019

Angular typeScript ile kullanılır. Angular’da geliştirme yapabilmek için bir editöre ve bir node’a ihtiyacımız var. Editör bizim kodlarımızı yazdığımız onu compile ettiğimiz klasörleyebildiğimiz ve o klasörlere rahat erişebildiğimiz, referanslar ekleyebildiğimiz kod yazmamıza yardımcı olan ortamlardır. -- Editörler vasıtasıyla çok daha rahat kod yazarız.

Birazda node ’dan bahsedelim. Node sitesine gittiğimiz zaman son sürümü bilgisayarımıza indirip kurabiliriz. Node ile javascript uygulamalarını çalıştırabiliyoruz yani yayına alabiliriyoruz veya node’ın package manager (npm) vasıtasıyla Angular ’da ihtiyaç duyduğumuz paketleri yönetebiliyoruz. Node paket yönetimi ve yaptığımız bir uygulamayı hızlıca build edip test ortamında yayınlamak için kullanacaz.

Angular CLI (Command Line Interface) ile yeni projeler oluşturabilir ve angular bileşenlerini hızlıca bu bileşen vasıtasıyla oluşturabiliyoruz. Projemizi yayına alacak ortamları kurabiliyoruz.
Angular CLI kurmak için aşağıdaki adımları takip edebiliriz.

kamilkapln:~$ npm install -g @angular/cli 
#
angularCLI intstall
kamilkapln:~$ ng new angularApp
#
created AngularApp Proje
kamilkapln:~$ cd angularApp
#
angularApp locate
kamilkapln:~$ ng serve
#
angularApp run localhot:4200 default
kamilkapln:~$ ng serve --open
#
angularApp scanner open
kamilkapln:~$ ng serve --open --port 1453
#
angularApp run localhot:1453 port

Eğer Angular CLI (npm) ‘ı daha önce yüklemiş iseniz ve yeni versiyonu çıkmış ve güncellemek istiyorsanız. Aşağıdaki adımları sırasıyla takip edebiliriz.

Upgrade AngularCLI to the lastestVersion

kamilkaplan:~$ npm uninstall -g angular/cli
kamilkaplan:~$ npm cache clean
kamilkaplan:~$ npm install -g @angular/cli@lastest

Angular Bootstrap ve Jquer Eklemek

Önceliklepackage.json dosyasında dependencies bölümüne

"dependencies": {
...
"bootstrap": "^4.3.1",
"jquery": "^3.4.1"
},

bootstrap ve jquery ‘i ekliyoruz. Şimdi eklediğimiz paketlerin uygulamaya eklenmesi lazım, node_module ‘in altına eklenmesi lazım. Yeni paketler eklediğimiz için Dependencies ’i güncellemeliyiz. Eğer projemiz çalışıyorsa durdurup npm install komutunu çalıştırıp paketleri yükleyip tekrar projemizi çalıştırabiliriz.
Bootstrapt ve Jquery yüklediğimize göre şimdi bunları kullanalım bunun için angular.json dosyasını açıp gerekli yerlere bootstrapt vejquery klasör yollarını ekleyelim.

"styles": [
"src/styles.css",
"node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"node_modules/jquery/dist/jquery.min.js",
"node_modules/bootstrap/dist/js/bootstrap.min.js"

]

Bu işlemide yaptıktan sonra bootstrap sayfasına girip kendimize bir menu seçelim ve çalıştıralım.

app.component.html

<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link active" href="#">Active</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
</li>
</ul>

Angular Component Kullanımı

Dinamik dataları kontrol etmek için angular ’da componentlerden yararlanırız. Uygulamamıza component eklemek çok kolay eğer visual studio code kullanıyorsanız eklentiler > angular files indirmenizi tavsiye ederim.

kamilkaplan:~$ ng generate component <componetName>

diyerek AngularCLI ile componet oluşturduk. Biz bir component oluşturduğumuz zaman componentimiz app.module.js içerisinde declarations içerisine eklemiş oluyoruz.

* Kısacası module içerinde componentleri barındırıyoruz *

kamilkaplan:~$ ng generate component post
kamilkaplan:~$ ng generate component directory

Sizler ile POST ve DIRECORY componentlerimizi oluşturduk. Şimdi bunların kullanımına bakalım.

app.module.ts

import {AppComponent} from './app.component';
import {PostComponent} from './post/post.component';
import {DirectoryComponent} from './directory/directory.component';
@NgModule({
declarations: [
AppComponent,
PostComponent,
DirectoryComponent,
],
imports: [],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}

Oluşturulan component leri sayfafımızda görüntülemek için app.component.html içerisine o componentimizin selector ismini vermeliyiz.

post.component.ts

import {Component, OnInit} from '@angular/core';@Component({
selector: 'app-post',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})

directory.component.ts

import {Component, OnInit} from '@angular/core';@Component({
selector: 'app-directory',
templateUrl: './directory.component.html',
styleUrls: ['./directory.component.css'],
providers: [DataService]
})

Şimdi bu componentlerden selector bölümlerini alıyoruz ve bizim app.component.ts içerine o component timizin sayfanın neresinde görünmesini istediğimize göre ekliyoruz.

app.component.html

<div class="container">
<div class="col-md-6">
<app-post></app-post> // POST COMPONENT
</div>
<div class="col-md-6">
<app-directory></app-directory> // DIRECTORY COMPONENT
</div>
</div>

Angular HttpClientModule Kullanımı

HttpClient module vasıtasıyla API ‘lerimize yani service ‘lerimize istekte bullunup oradaki datayı tüketebiliriz yani alabiliriz. Kısacası Http ile GET POST PUT DELETE gibi operasyonları gerçekleştirebiliriz. Şimdi kendimize hazır bir api bulup buna istekte bulunup ve listeleme işlemi yapalım. Ben bir tane API buldum.

API : https://jsonplaceholder.typicode.com/posts

Öncelikle HttpClientModule ’ü kullanabilmemiz için öncelikleapp.module.ts dosyamızda onu import etmemiz gerekiyor.

import {HttpClientModule} from '@angular/common/http';

Yaptığımız bu işlem ile sadece import etmiş olduk imports sekmesinde ’de HttpClientModule ü yazmalıyız. Bu bize imports sekmesinde tanımlı moduller başkalarının yazdığı ama bizim uygulamamızda kullanmak isteğimiz kısacası import etmek istediğimiz modulleri içerir.

app.module.ts

import {AppComponent} from './app.component';
import {PostComponent} from './post/post.component';
import {DirectoryComponent} from './directory/directory.component';
import {HttpClientModule} from '@angular/common/http';
@NgModule({
declarations: [
AppComponent,
PostComponent,
DirectoryComponent,
],
imports: [
HttpClientModule
],
providers: [], // global service
bootstrap: [AppComponent]
})
export class AppModule {
}

Şimdi kullanacağımız API için modelimizi oluşturalım. Bu işlemi neden yapıyoruz diye şimdi soruyorsunuz muhtemelen, sırada cevabı var. Bu işlemi bize API ’den dönen verilerin (columların) bu model tipinde döndüğünü biliyoruz ve ona göre http işlemini yapıyoruz. Yani apideki veriler bu formatta saklı bizim componentlerimize yani .html uzantılı dosyalarımıza yazdırırken kullanacağımız modeldir. Bunu eğer şimdi anlamadıysanız post.component.ts sayfasında çalışırken kesinlikle anlayacaksınız. Bize API ’den dönen değerleri ekrana yazdırmak istediğimizde ne ile yazdıracağımızı tam olarak bilmiyoruz. Bundan dolayı modeli tanımlıyoruz diyebilirim.

Öncelikle ` src ‘nin altında models klasörü oluşturuyoruz. Onun içine postModel adında bir model ekliyoruz.

postModel.ts

export class PostModel {  
userId: number;
id: number;
title: string;
body: string;
}

Şimdi daha service ’lere gelmediğimiz için Http ile istekte bulunma işlemini şimdilik post.component.ts dosyamızda gerçekleştireceğiz. Normalde bu işlemleri service ile gerçekleştiririz. post.component.ts içerisine gelip HttpClientModule ü içinceki HttpClient sınıfını kullanacağız. Öncelikle onu import etmeliz.

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

Import etmiş olduğumuz HttpClient bir service’dir. Service ’ler angular’da constructor içerisinde dependency injection ile oluşturulur.

post.component.ts

import {Component, OnInit} from '@angular/core';
import {HttpClient} from '@angular/common/http';
@Component({
selector: 'app-post',
templateUrl: './post.component.html',
styleUrls: ['./post.component.css'],
})
export class PostComponent implements OnInit {
constructor(public http: HttpClient) {
}
ngOnInit() {
}
}

Şimdi http operasyonlarında GET i gerçekleştirelim. Bunun için bir metod tanımlayalım getProducts() bunun içerisinde gelip ürünleri ekranda göstermek istiyoruz. Yalnız bu ürünleri oluşturduğumuz modelde doldurduğumuzda .html sayfaına taşımamız lazım bizede array döndüğü için posts: PostModel[]; tipinde bir array tanımlıyoruz.

post.component.ts

import {Component, OnInit} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {PostModel} from './post.model';
@Component({
selector: 'app-post',
templateUrl: './post.component.html',
styleUrls: ['./post.component.css'],
})
export class PostComponent implements OnInit {

constructor(public http: HttpClient) {
}

posts: PostModel[];
_url: string = 'https://jsonplaceholder.typicode.com/posts';
ngOnInit() { // page loaded
this.getPosts();
}

getPosts() { // return model PostModel[] datas
this.http.get<PostModel[]>(this._url)
.subscribe(res => {
this.posts = res
});
}
}

Şimdi http işlemimizi yaptık bunları ben ekranda göstermek istiyorum. Bunun için post.component.html sayfasına gidiyoruz.

<p>
POST COMPONENT
</p>
<table class="table">
<tr *ngFor="let post of posts">
<td>{{post.id}}</td>
<td>{{post.title}}</td>
<td>{{post.body}}</td>
</tr>
</table>

Angular Services (Declaration) Kullanımı

Şimdi Angular ’da önemli bir konudan bahsetmek istiyorum. Az önce biz uygulmamızda getPosts() metodu içerisinde postları çağıracak kodu yazdık. Düşününki bu kodu onlarca sayfada kullanıyoruz. Yani onlarca sayfada listeliyoruz. Bunun için yazmış olduğumuz kodu tekrar tekrar yazmamız gerekir. Bunu yapmamak için Angular ’da service lerden yararlanıyoruz. Yani bu kosumuzu başka bir yere yazıyoruz, oradaki operasyonu kullanacağımız componentin içerisine enjecte ediyoruz. Injection işleminin nasıl yapıldığını birazdan göreceğiz. Bu şekilde service leri kullanıyoruz.

SERVİCE ler aynı zamanda uygulamanın yaşam döngüsünde nesne üretimi içinde ciddi faydalar sağlıyor. Yani daha performanslı uygulamalarda üretmiş oluyoruz. Şimdi uygulamamızda service leri kullanalım. Öncelikle ` src ‘nin altında providers klasörü oluşturuyoruz. Onun içine post adında bir service ekliyoruz.

kamilkaplan:~$ import generate service post  veya  import g s post

Service’ lerde birer class tır. expport edilmesi gerekiyor. En önemliside service olabilmesi için @Injectable decolatörüyle süslenmesi gerekiyor. Yani class injectable ile service haline geliyor.

post.service.ts

import {Injectable} from '@angular/core';@Injectable({
providedIn: 'root'
})
export class PostService {
constructor() {
}
}

Şimdi post.component.ts içerisine yazmış olduğumuz getPosts() metodumuzu service içerisine yani post.service.ts içerisine yazabiliriz.

import {Injectable} from '@angular/core';
import {PostModel} from '../models/post';
import {HttpClient} from '@angular/common/http';
import {Observable} from 'rxjs';

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

_url: string = 'https://jsonplaceholder.typicode.com/posts';

constructor(private http: HttpClient) {
}

getPosts(): Observable<PostModel[]> {
return this.http.get<PostModel[]>(this._url);
}
}

Şimdi biz bu service i kullanmak için post.componet.ts içerisine import etmeliyiz.

import {PostService} from '../../providers/post.service';

import etme işlemini gerçekleştiğine göre bu bir service olduğu için bunu constructor içerisinde tanımlamalıyız.

post.component.ts

import {Component, OnInit} from '@angular/core';
import {PostModel} from '../../models/post';
import {PostService} from '../../providers/post.service';

@Component({
selector: 'app-post',
templateUrl: './post.component.html',
styleUrls: ['./post.component.css'],
providers: [PostService] // local service
})
export class PostComponent implements OnInit {
posts: PostModel[];

constructor(private postService: PostService) {
}

ngOnInit() {
this.getPosts();
}

getPosts() {
this.postService.getPosts().subscribe(
res => {
this.posts = res;
}
);
}
}

Angular Routing Kullanımı

Angularda öncemli konulardan bir taneside router routing mimarisidir. Öncelikle app.module.ts dosyamıza gidip RouterModule ü import etmeliyiz.

import {RouterModule, Routes} from '@angular/router';

Şimdi Angular ’a şunu anlatmamız gerekiyor. Gelen istek adresine bakıp hangi componenti açacağına karar vermesini söylemek için yapıyoruz aslında Routing işlemini. Bunun için bizim app.module.ts dosyasının içinde bir tane sabit tanımlamamız lazım.

const routes: Routes = [
{path: '', redirectTo: '/post', pathMatch: 'full'},
{path: 'post', component: PostComponent},
{path: 'directory', component: DirectoryComponent},
{path: '**', component: PageNotFoundComponent}
];

Bir module eklediğimiz zaman, bu module ü projemizde kullanabilmemiz için imports kısmına eklememiz lazım.

app.module.ts

import {AppComponent} from './app.component';
import {PostComponent} from './post/post.component';
import {DirectoryComponent} from './directory/directory.component';
import {HttpClientModule} from '@angular/common/http';
import {RouterModule,
Routes} from '@angular/router';
const routes: Routes = [
{path: '', redirectTo: '/post', pathMatch: 'full'},
{path: 'post', component: PostComponent},
{path: 'directory', component: DirectoryComponent},
{path: '**', component: PageNotFoundComponent}
];
@NgModule({
declarations: [
AppComponent,
PostComponent,
DirectoryComponent,
],
imports: [
HttpClientModule,
RouterModule.forRoot(routes)
],
providers: [], // global service
bootstrap: [AppComponent]
})
export class AppModule {
}

Bizim projemizde değişken kısım neresi ise, yani size şöyle anlatayım ilk başta app.component.html içerisinde

<div class="container">
<div class="col-md-6">
<app-post></app-post> // POST COMPONENT
</div>
<div class="col-md-6">
<app-directory></app-directory> // DIRECTORY COMPONENT
</div>
</div>

post componentimizi sayfanın bir yanına directory componentimizi sayfanın diğer bir yanına vermiştik. Şimdi sayfamızı düzenleyelim. Sayfamızda load (değişken) olacak kısım için yani değişken olan kısım için sayfamızda değişken route a göre değişken olacak kısım ’a
<router-outlet></router-outlet> isimli tag ’i vermemiz gerekiyor.

<div class="container">
<div class="col-md-3">
<app-menu></app-menu> // sabit kısım
</div>
<div class="col-md-9">
<router-outlet></router-outlet> // değişken kısım
</div>
</div>

PROJENİN ÇALIŞIR HALİ GİTHUB ADRESİMDE

Umarım faydalı bir yazı olmuştur. Herkese mutlu kodlamalar.
KAMİL KAPLAN ( Software Engineer )

Bir sonraki makalede görüşmek ümidi ile sağlıcakla kalın.

--

--