जवाबों:
कोणीय 2 में आप subscribe
(Rx घटना) को एक राउटर उदाहरण के लिए कर सकते हैं। तो आप जैसे काम कर सकते हैं
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
संपादित करें (rc.1 के बाद से)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
2 संपादित करें (2.0.0 से)
इन्हें भी देखें: Router.events डॉक्टर
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))
Peilonrayz के लिए धन्यवाद (नीचे टिप्पणी देखें)
नया राउटर> = RC.3
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 और ऊपर:
यह नीचे दिए गए के रूप में ActivatedRoute वर्ग की 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 और RxJS6 में:
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
});
दोनों के बीच अंतर देखने के लिए, कृपया इस SO प्रश्न को देखें ।
संपादित करें
नवीनतम के लिए आपको करना चाहिए:
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);
}
}
अधिकांश समाधान सही हैं, लेकिन मैं इस समस्या का सामना कर रहा हूं, यह कई बार 'नेविगेशन उत्सर्जन' घटना है। जब भी इस घटना को चालू किया जाता है तो मैं बदल जाता था। तो सुनिए एंगुलर 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 अनुप्रयोग के साथ काम कर रहा हूं और मैं उसी मुद्दे का सामना कर रहा हूं। जब मैं कोणीय दस्तावेज़ीकरण से गुजरता हूं तो वे राउटर घटनाओं से निपटने के लिए सबसे अच्छा समाधान प्रदान करते हैं। दस्तावेज़ के बाद जांच करें।
कोणीय 5 में कोणीय मार्ग की घटनाओं में राउटर इवेंट
लेकिन विशेष रूप से मामले के लिए प्रश्न में हमें नेविगेशनएंड इवेंट की आवश्यकता है
जब नेविगेशन सफलतापूर्वक समाप्त हो जाता है तो एक घटना का प्रतिनिधित्व करता है
इसका उपयोग कैसे करें?
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");
}
});
}
}
इसका उपयोग कब करें?
मेरे मामले में मेरा आवेदन सभी उपयोगकर्ताओं के लिए आम डैशबोर्ड साझा करता है जैसे कि उपयोगकर्ता, एडमीन, लेकिन मुझे उपयोगकर्ता प्रकार के अनुसार कुछ नौबार विकल्प दिखाने और छिपाने की आवश्यकता है।
इसीलिए जब भी url में परिवर्तन होता है, मुझे सेवा पद्धति पर कॉल करने की आवश्यकता होती है, जो प्रतिक्रिया के अनुसार उपयोगकर्ता जानकारी में लॉग इन करता है, मैं आगे के संचालन के लिए जाऊंगा।
निम्नलिखित काम करता है और आप के लिए मुश्किल हो सकता है।
// 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
} );
जैसे AppRoutModule पर बदलाव करें
@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
आशा है कि मैं बेहतर तरीके से डेटा प्राप्त कर सकता हूं