Angular 1 to Angular 2 Journey
Published on November 11, 2016
In this post, we will see how to convert Angular 1 knowledge into Angular 2.
Assumptions: We can write Angular 1 in both JavaScript ES5 and ES6. Angular 2 in TypeScript and JavaScript.
We will use JavaScript ES5 for Angular 1 and TypeScript for Angular 2 in this post.
1) Modules
For both Angular 1 and Angular, 2 Modules are a great way to organzine application code. We can group different controller (or) Component and providers via modules.
Angular 1
angular
.module('AppModule', [])
This will create a module.
Angular 2
import { NgModule } from '@angular/core';
@NgModule({
imports: [ ],
declarations: [ ],
bootstrap: [ ]
})
export class AppModule { }
We use @NgModule
decorator to create module in Angular 2.
2) Components
Angular components are the way to group template and javascript functionality code together.
From Angular 1.5 onwards we have .component
API in angular 1. Let’s use it here. we can also create components using directives but we will use .component
here.
Angular 1
var app = angular.module('app'); // module getter
app.component('AppComponent', {
bindings: {
uname: '<'
},
template: '<h1>Hellow welcome {{uname}}</h1>',
controller: function() {
// any logic here
}
});
.component
expected a object with bindings
, ‘template’ and ‘controller()’ properties. Of course, there are few more but we will use only this here.
in your HTML, you can write.
In Angular 1 the component name AppComponent
converted to dashed case and use as HTML
tag.
bindings
objects contains input and output parameter of that component. Here <
represents input binding.
template
hold HTML template of that component.
controller()
contains all functionality code for that component.
<app-component uname="John"></app-component>
Angular 2
import { @Component, @Input } from '@angular/component';
@Component({
selector: 'app-component',
template: `<h1>This is App Component</h1>`,
})
export class AppComponent {
@Input() uname: string;
}
We need to tell angular where to look for this component.
import { HttpModule } from '@angular/http';
import { NgModule } from '@angular/core';
import { AppComponent } from '../app.component'
@NgModule({
imports: [
HttpModule
],
declarations: [
AppComponent
],
providers: [ ],
bootstrap: [ ]
})
export class AppModule { }
If it’s a component or Directive we need to add it to the declarations
array of @NgModule
metadata.
now in our HTML
<app-component [uname]="John"></app-component>
Angular 2 uses @Component
decorator on class AppComponent
which expects a metadata object.
selector
is for HTML tag what we want to create.
template
holds HTML template which is same as.
class AppComponent
instead of controller()
in Angular 1 here we have a class to hold the functionality of the component.
Here we have @Input
decorator which is used for getting inputs for the component. Simpler to the bindings in angular but in Angular 1 bindings can have both input, output, and two-way bidding. In Angular 2 we have only @Input
, @Output
bindings.
2) Directives
Angular 1 directives are same as Components . In fact, Angular 1 component internally use directive API to create a component. Basically, directives are the way to create new HTML
tags.
var app = angular.module('App', []);
app.directive('myAvatar', function() {
return {
template: '<h1>This is custom html tag</h1>'
};
});
this code will create an HTML tag.
<my-avatar></my-avatar>
which html page loaded we will see
<h1>This is custom html tag</h1>
on the page.
In Angular 2 we have three kinds of Directives
- Components directives with a template.
- Structural directives—change the DOM layout by adding and removing DOM elements.
- Attribute directives—change the appearance or behavior of an element.
Components are something we already saw before. Structural and Attribute directives can be used to manipulate the DOM of an element.
In Angular 2 we see structural directives like *ngIf
, *ngFor
. Creating custom structural directives are out of the scope of this post. I will write an another blog post about it.
Now let’s create a simple Attribute directive.
import { Directive, ElementRef,
Input, Renderer } from '@angular/core';
@Directive({
selector: '[makeMeYellow]'
})
export class MakeMeYellowDirective {
constructor(el: ElementRef, renderer: Renderer) {
renderer.setElementStyle(el.nativeElement, 'color', 'yellow');
}
}
Again need to tell angular where to look for this Directive. We can do this by adding this directive to the @NgModule
.
import { HttpModule } from '@angular/http';
import { NgModule } from '@angular/core';
import { MakeMeYellowDirective } from '../make-me-yellow.direcive'
@NgModule({
imports: [
HttpModule
],
declarations: [
MakeMeYellowDirective
],
providers: [ ],
bootstrap: [ ]
})
export class AppModule { }
What this directive does is it will change the text color of the HTML node it is applied to.
All valid CSS selector can be used with
Selector
properties in entire Angular 2.
to use this.
<p makeMeYellow class="main-text"> lorem ipsam </p>
3) Services
Angular 1 we have three kinds of services providers
,services
and factories
.
In Angular 2 we have only one service which is almost equivalent to angular 1 .service
API.
let’s see an example with it.
var app = angular.module('App', []);
app.service('GitHubService', [$http,function($http){
var apiUrl = '//api.github.com/users';
var self = this;
this.data = [];
this.getUsers = function() {
return $http.get(apiUrl).then(function(userData) {
self.data = userData;
});
}
}]);
In Angular 2 we have only one way to create service.
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
@Injectable()
export class GitHubService {
private apiUrl:string = `//api.github.com/users`;
private data:Array<any>;
// inject Http service into this service
constructor(private http: Http) {
}
// get Github users
getUsers() {
return this.http.get(this.apiUrl).toPromise();
}
}
Angular 1 and Angular 2 have almost similer implmention for services. Please not Angular 2 doesn’t have http
module by default we need to import the HttpModule
when we bootstrap our appliction.
import { HttpModule } from '@angular/http';
import { NgModule } from '@angular/core';
import { GitHubService } from '../git-hub-service'
@NgModule({
imports: [
HttpModule
],
declarations: [
],
providers: [ GitHubService ],
bootstrap: [ ]
})
export class AppModule { }
Here we did two things. We imported HttpModule
and added it to our AppModule
via imports
array and imported GitHubService
which created earler and added it to our AppModule
via providers
property of the @NgModule
;
4) Controller
Just to refresh our memory in Angular 1 we can write our controllers
var app = angular.module('App',[]);
app.controller('MainCtrl', function(){
// function inside a controller
this.onSignupClick = function(){
console.log('Signup button clicked');
}
});
We can apply this controller as
<div ng-controller="MainCtrl as vm">
<button ng-click="vm.onSignupClick()"></button>
</div>
But in Angular 2 we don’t have any concept such as creating separate controllers. Instead, everything in Angular 2 is Components So no controller concept in Angular 2.
5) Filters
Filter have many usages in Angular. Basically, we use Filters
format and filter the data in UI side.
Let’s create simple Filter in Angular 1
var app = Angular.module('App',[]);
app.filter('uppercase', function(value){
return value.toUpperCase();
});
Now, To apply this filter
<p> Hellow my name is {{ name | uppercase}}<p>
In Angular 2 Filters called as Pipes.
Let’s implement the above filter in Angular 2.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'uppercase'
})
export class UppercasePipe implements PipeTransform {
transform(value: string): string {
return value.toUpperCase();
}
}
That’s it. We have created a filter in Angular 2. In Angular 2 we use @Pipe
decorator to implement the filter.
Inside the UppercasePipe
class we should have a transform
function to implemented.