Submodule 22.1: Angular and Reactive programming - Practice
Site: | ΕΛ/ΛΑΚ Moodle |
Course: | Study / Web Design and Web Development |
Book: | Submodule 22.1: Angular and Reactive programming - Practice |
Printed by: | Guest user |
Date: | Thursday, 21 November 2024, 5:28 PM |
Introduction
In this submodule, you will get your first experience with Observables in Angular. You will modify the services to use Observables.
You will then also enable the components to subscribe to the observables and make use of them to obtain the data. You will :
- Make use of observables within your Angular application
- Obtain data by subscribing to the observables within your components.
In order to create applications with reactive programming, we will use the RxJS library. This library is by default included within the Angular as is shown in the image below:
Updating the Services
Open dish.service.ts
and update its methods as follows:
...
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/delay';
import 'rxjs/add/observable/of';
...
@Injectable()
export class DishService {
constructor() { }
getDishes(): Observable<Dish[]> {
return Observable.of(DISHES).delay(2000);
}
getDish(id: number): Observable<Dish> {
return Observable.of(DISHES.filter((dish) => (dish.id === id))[0]).delay(2000);
}
}
Note
- The import of
{ Observable } from 'rxjs/Observable';
- The import of a couple of operators that we need in our dish service. We use these operators just to check that the Observables work.
import 'rxjs/add/operator/delay'
import 'rxjs/add/observable/of'
-
- If you want to emit only one value from your Observable, you will use the
of
method and this will take in whatever value that you want to emit in there. - The
delay(2000)
we want to delay the emitting of the value by two seconds
- If you want to emit only one value from your Observable, you will use the
- Also, while testing if observables work you should keep in mind the things below:
- The
Observable<Dish[]>
in the getDishes method. It returns an Observeble of Dish array instead of the Dish array itself. We will now update our service to return Observables, and we will update the components to make use of Observables. The reason is that when we update our services to use the HTTP service to go to a server to fetch the data, then in Angular, the HTTP methods will return Observables. Also, the services can simply pass the Observables to our components and let the components subscribe to these Observables and make use of the data that they obtained. - The
return Observable.of(DISHES)
to return those Dishes.
Update menu.component.ts
Update menu.component.ts
as follows to subscribe to the observable returned from the service:
ngOnInit() {
this.dishService.getDishes().subscribe(dishes => this.dishes = dishes);
}
So, when you go to the menu component.ts, you will notice that there is a red line under this.dishes
. This is because now the dishService.getDishes()
is returning an observable and not the Dish array. So in the this.dishes = this.dishService.getDishes();
you have the observable being assigned to a dish array object, which is incorrect.
How do we reconfigure this code?
We subscribe the MenuComponent to "listen" to the Observable. Your menu component is now able to use the Observable values that are being emitted by the Observable.
So we have the dishService.getDishes, and then the subscribe method chained to it. When the subscribe is called, the dishes will be delivered to you because the getDishes method is returning the observable Observable.of(DISHES)
. So this is what we use as the parameter dishes
in the left side of the arrow function dishes => this.dishes = dishes
. We use the arrow function to assign the parameter to the this.dishes
. The this.dishes is the variable of the menu.component.ts for which we have already declared its type as Dish[]
and is also used in the menu.component.html in the *ngFor structural directive.
Update dishdetail.component.ts
Similarly update dishdetail.component.ts to subscribe to the observables from the service.
ngOnInit() {
this.dishservice.getDish(id).subscribe(dish => this.dish = dish);
}
Here the process is similar to what we did in the menu component.ts, but now we take only the selected dish which comes from the filter applied in the array.
The results
With the previous code configured, open your Terminal, go to the angularChocoYourname
angular-sub-folder and run ng serve
to run your application in development mode. In your browser navigate to the URL localhost:4200
As you can see the content of the pages appear with a delay of two seconds.
Do a Git commit with the message "Angular RxJs Introduction".