উত্তর:
কৌনিক 2 এ আপনি subscribe
একটি রাউটার উদাহরণে (আরএক্স ইভেন্ট) করতে পারেন । সুতরাং আপনি যেমন জিনিস করতে পারেন
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
সম্পাদনা করুন (আরসি 1 থেকে)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
2 সম্পাদনা করুন (২.০.০ থেকে)
আরও দেখুন: রাউটার.এভেন্টস ডক
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
filter
অপারেটরের সাথে ইভেন্টগুলি সহজেই ফিল্টার করতে পারবেন । router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
আরএক্সজেএস 6
router.events.pipe(filter(event => event instanceof NavigationStart))
পিলোনরেজকে ধন্যবাদ (নীচে মন্তব্য দেখুন)
নতুন রাউটার> = আরসি ৩
import { Router, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RoutesRecognized } from '@angular/router';
constructor(router:Router) {
router.events.forEach((event) => {
if(event instanceof NavigationStart) {
}
// NavigationEnd
// NavigationCancel
// NavigationError
// RoutesRecognized
});
}
আপনি প্রদত্ত ইভেন্টের মাধ্যমেও ফিল্টার করতে পারেন:
import 'rxjs/add/operator/filter';
constructor(router:Router) {
router.events
.filter(event => event instanceof NavigationStart)
.subscribe((event:NavigationStart) => {
// You only receive NavigationStart events
});
}
পূর্ববর্তী এবং বর্তমান ইভেন্টটি পেতে pairwise
অপারেটরটি ব্যবহার করাও একটি দুর্দান্ত ধারণা। https://github.com/angular/angular/issues/11268#issuecomment-244601977
import 'rxjs/add/operator/pairwise'; import { Router } from '@angular/router; export class AppComponent { constructor(private router: Router) { this.router.events.pairwise().subscribe((event) => { console.log(event); }); }; }
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
ত্রুটিটি হ'ল কারণ আপনার ফিল্টার স্নিপেটে আপনি নেভিগেশনএভেন্টের পরিবর্তে ইভেন্ট টাইপের কোনও অবজেক্টের সাবস্ক্রাইব করছেন।
জন্য কৌণিক 7 কেউ মত লেখা উচিত:
this.router.events.subscribe((event: Event) => {})
একটি বিস্তারিত উদাহরণ নিম্নরূপ হতে পারে:
import { Component } from '@angular/core';
import { Router, Event, NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
@Component({
selector: 'app-root',
template: `<router-outlet></router-outlet>`
})
export class AppComponent {
constructor(private router: Router) {
this.router.events.subscribe((event: Event) => {
if (event instanceof NavigationStart) {
// Show loading indicator
}
if (event instanceof NavigationEnd) {
// Hide loading indicator
}
if (event instanceof NavigationError) {
// Hide loading indicator
// Present error to user
console.log(event.error);
}
});
}
}
কৌণিক 7 , আপনি করতে চান তাহলে subscribe
করতেrouter
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
constructor(
private router: Router
) {
router.events.pipe(
filter(event => event instanceof NavigationEnd)
).subscribe((event: NavigationEnd) => {
console.log(event.url);
});
}
কৌণিক 4.x এবং উপরে:
এটি নীচের মতো অ্যাক্টিভেটেড রুট শ্রেণির url সম্পত্তি ব্যবহার করে অর্জন করা যেতে পারে ,
this.activatedRoute.url.subscribe(url =>{
console.log(url);
});
দ্রষ্টব্য:
আপনার angular/router
প্যাকেজ থেকে সরবরাহকারীটি আমদানি এবং ইনজেক্ট করতে হবে
import { ActivatedRoute } from '@angular/router`
এবং
constructor(private activatedRoute : ActivatedRoute){ }
রাউটার 3.0.0-beta.2 হওয়া উচিত
this.router.events.subscribe(path => {
console.log('path = ', path);
});
কৌণিক 6 এবং আরএক্সজেএস 6 এ:
import { filter, debounceTime } from 'rxjs/operators';
this.router.events.pipe(
filter((event) => event instanceof NavigationEnd),
debounceTime(40000)
).subscribe(
x => {
console.log('val',x);
this.router.navigate(['/']); /*Redirect to Home*/
}
)
import {Router, NavigationEnd} from "@angular/router"
উত্তর এখানে জন্য সঠিক router-deprecated
। এর সর্বশেষ সংস্করণটির জন্য router
:
this.router.changes.forEach(() => {
// Do whatever in here
});
অথবা
this.router.changes.subscribe(() => {
// Do whatever in here
});
দুজনের মধ্যে পার্থক্যটি দেখতে, দয়া করে এই এসও প্রশ্নটি দেখুন ।
সম্পাদন করা
সর্বশেষের জন্য আপনাকে অবশ্যই:
this.router.events.subscribe(event: Event => {
// Handle route change
});
router
আবার আপডেট করা হয়েছে (আমি আমার উত্তর এখনও আপডেট হয়েছে), তাই আমি নিশ্চিত কিভাবে এটা সর্বশেষ জন্য নই। জন্য router
আমি নিয়ে লিখেছেন, আপনি না। @akn
কৌনিক 8 এ আপনার পছন্দ করা উচিত this.router.events.subscribe((event: Event) => {})
উদাহরণ:
import { Component } from '@angular/core';
import { Router, Event } from '@angular/router';
import { NavigationStart, NavigationError, NavigationEnd } from '@angular/router';
@Component({
selector: 'app-root',
template: `<router-outlet></router-outlet>`
})
export class AppComponent {
constructor(private router: Router) {
//Router subscriber
this.router.events.subscribe((event: Event) => {
if (event instanceof NavigationStart) {
//do something on start activity
}
if (event instanceof NavigationError) {
// Handle error
console.error(event.error);
}
if (event instanceof NavigationEnd) {
//do something on end activity
}
});
}
}
উপাদানটিতে, আপনি এটি চেষ্টা করতে পারেন:
import {NavigationEnd, NavigationStart, Router} from '@angular/router';
constructor(private router: Router) {
router.events.subscribe(
(event) => {
if (event instanceof NavigationStart)
// start loading pages
if (event instanceof NavigationEnd) {
// end of loading paegs
}
});
}
নিম্নলিখিত পদ্ধতিতে রুট পরিবর্তন ইভেন্টগুলি ক্যাপচার করুন ...
import { Component, OnInit, Output, ViewChild } from "@angular/core";
import { Router, NavigationStart, NavigationEnd, Event as NavigationEvent } from '@angular/router';
@Component({
selector: "my-app",
templateUrl: "app/app.component.html",
styleUrls: ["app/app.component.css"]
})
export class AppComponent {
constructor(private cacheComponentObj: CacheComponent,
private router: Router) {
/* Route event types
NavigationEnd
NavigationCancel
NavigationError
RoutesRecognized
*/
router.events.forEach((event: NavigationEvent) => {
//Before Navigation
if (event instanceof NavigationStart) {
switch (event.url) {
case "/app/home":
{
//Do Work
break;
}
case "/app/About":
{
//Do Work
break;
}
}
}
//After Navigation
if (event instanceof NavigationEnd) {
switch (event.url) {
case "/app/home":
{
//Do Work
break;
}
case "/app/About":
{
//Do Work
break;
}
}
}
});
}
}
অবস্থান কাজ করে ...
import {Component, OnInit} from '@angular/core';
import {Location} from '@angular/common';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
constructor(private location: Location) {
this.location.onUrlChange(x => this.urlChange(x));
}
ngOnInit(): void {}
urlChange(x) {
console.log(x);
}
}
বেশিরভাগ সমাধানগুলির উপরে সঠিক, তবে আমি এই এমিটটি একাধিকবার 'নেভিগেশন এমিট' ইভেন্টের মুখোমুখি করছি w সুতরাং শুনুন কৌণিক 6 এর সম্পূর্ণ সমাধান।
import { Subscription } from 'rxjs/Subscription';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/filter';
export class FooComponent implements OnInit, OnDestroy {
private _routerSub = Subscription.EMPTY;
constructor(private router: Router){}
ngOnInit(){
this._routerSub = this.router.events
.filter(event => event instanceof NavigationEnd)
.subscribe((value) => {
//do something with the value
});
}
ngOnDestroy(){
this._routerSub.unsubscribe();
}
}
@ লুডোহেন উত্তরটি দুর্দান্ত, তবে আপনি যদি instanceof
নিম্নলিখিতটি ব্যবহার করতে না চান তবে
this.router.events.subscribe(event => {
if(event.constructor.name === "NavigationStart") {
// do something...
}
});
এই পদ্ধতিতে আপনি বর্তমান ইভেন্টের নামটি স্ট্রিং হিসাবে পরীক্ষা করতে পারেন এবং যদি ইভেন্টটি ঘটে থাকে তবে আপনি নিজের ফাংশনটি করার জন্য যা পরিকল্পনা করেছিলেন তা করতে পারেন।
Event
ধরণের কারণে এটিম একটি ত্রুটি ঘটায় যে কারণে আমি এটি ব্যবহার করিনি
instanceOf
আপনার বরং ব্যবহার করা উচিত যাতে আপনার উদাহরণটি উত্পাদন কোডেও কাজ করবে। if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
আমি কৌনিক 5 অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং আমি একই সমস্যার মুখোমুখি হচ্ছি। যখন আমি কৌনিক ডকুমেন্টেশন দিয়ে যাই তারা রাউটার ইভেন্টগুলি পরিচালনা করার জন্য সর্বোত্তম সমাধান সরবরাহ করে following
কৌণিক রাউটার ইভেন্টে কৌণিক রাউটের ইভেন্টগুলি ang
তবে বিশেষত মামলার জবাবদিহি করার জন্য আমাদের নেভিগেশনএন্ড ইভেন্টের প্রয়োজন
কোনও নেভিগেশন সফলভাবে শেষ হলে ট্রিগার হওয়া ইভেন্টটির প্রতিনিধিত্ব করে
এটি কিভাবে ব্যবহার করবেন?
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRouteSnapshot, NavigationEnd } from '@angular/router';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
constructor(private router: Router) { }
ngOnInit(): void {
//calls this method when navigation ends
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
//calls this stuff when navigation ends
console.log("Event generated");
}
});
}
}
কখন এটি ব্যবহার করবেন?
আমার ক্ষেত্রে আমার অ্যাপ্লিকেশনটি ব্যবহারকারীর, অ্যাডমিনদের মতো সমস্ত ব্যবহারকারীর জন্য সাধারণ ড্যাশবোর্ড শেয়ার করে তবে ব্যবহারকারীর ধরণ অনুসারে আমাকে কিছু নভবার অপশন দেখানো এবং আড়াল করা দরকার।
এই কারণেই যখনই ইউআরএল পরিবর্তন হয় তখন আমাকে পরিষেবা পদ্ধতিতে কল করতে হবে যা প্রতিক্রিয়া অনুসারে ব্যবহারকারীর তথ্যে লগইন করে যে আমি আরও ক্রিয়াকলাপে যাব।
নিম্নলিখিত ধরণের কাজ করে এবং আপনার জন্য কৌতূহলপূর্ণ হতে পারে।
// in constructor of your app.ts with router and auth services injected
router.subscribe(path => {
if (!authService.isAuthorised(path)) //whatever your auth service needs
router.navigate(['/Login']);
});
দুর্ভাগ্যক্রমে এই রাউটিং প্রক্রিয়াটি আমার পছন্দের চেয়ে পরে পুনর্নির্দেশ করে। onActivate()
মূল লক্ষ্য উপাদানের পুনর্নির্দেশ আগে বলা হয়।
@CanActivate
আপনি লক্ষ্য উপাদানটিতে ব্যবহার করতে পারেন এমন একটি ডেকোরেটর রয়েছে তবে এটি ক) কেন্দ্রীভূত নয় এবং খ) ইনজেকশন পরিষেবাদি থেকে উপকৃত হয় না।
কেউ যদি কোনও রুট প্রতিশ্রুতিবদ্ধ হওয়ার আগে কেন্দ্রীয়ভাবে অনুমোদনের আরও ভাল উপায়ের পরামর্শ দিতে পারে তবে তা দুর্দান্ত হবে। আমি নিশ্চিত আরও ভাল উপায় থাকতে হবে।
এটি আমার বর্তমান কোড (রুট পরিবর্তন শোনার জন্য আমি কীভাবে এটি পরিবর্তন করব?):
import {Component, View, bootstrap, bind, provide} from 'angular2/angular2';
import {ROUTER_BINDINGS, RouterOutlet, RouteConfig, RouterLink, ROUTER_PROVIDERS, APP_BASE_HREF} from 'angular2/router';
import {Location, LocationStrategy, HashLocationStrategy} from 'angular2/router';
import { Todo } from './components/todo/todo';
import { About } from './components/about/about';
@Component({
selector: 'app'
})
@View({
template: `
<div class="container">
<nav>
<ul>
<li><a [router-link]="['/Home']">Todo</a></li>
<li><a [router-link]="['/About']">About</a></li>
</ul>
</nav>
<router-outlet></router-outlet>
</div>
`,
directives: [RouterOutlet, RouterLink]
})
@RouteConfig([
{ path: '/', redirectTo: '/home' },
{ path: '/home', component: Todo, as: 'Home' },
{ path: '/about', component: About, as: 'About' }
])
class AppComponent {
constructor(location: Location){
location.go('/');
}
}
bootstrap(AppComponent, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, {useValue: '/'})]);
আরসি 5 সাল থেকে আমি এটি এটি করি
this.router.events
.map( event => event instanceof NavigationStart )
.subscribe( () => {
// TODO
} );
পছন্দ মতো অ্যাপরআউটিংমডুলিতে কেবল পরিবর্তন করুন
@NgModule({
imports: [RouterModule.forRoot(routes, { scrollPositionRestoration: 'enabled' })],
exports: [RouterModule]
})
আমি এই জাতীয় কিছু লিখতে হবে:
ngOnInit() {
this.routed = this.router.events.map( event => event instanceof NavigationStart )
.subscribe(() => {
} );
}
ngOnDestroy() {
this.routed.unsubscribe();
}
event._root.children[0].value._routeConfig.data
আশা করি আরও ভাল উপায় হতে পারে আশা করে আমি ডেটা পেতে সক্ষম হচ্ছি