কৌনিক 2 রাউটার দিয়ে কীভাবে বর্তমান রুটটি পুনরায় লোড করা যায়


141

আমি হ্যাশলোকেশন কৌশল সহ কৌনিক 2 ব্যবহার করছি।

উপাদানটি সেই রুট দিয়ে লোড করা হয়েছে:

"departments/:id/employees"

এখন পর্যন্ত ঠিক আছে।

আমি একাধিক সম্পাদিত সারণী সারিগুলির সফল ব্যাচ সংরক্ষণের পরে আমি বর্তমান রুটের url এর মাধ্যমে পুনরায় লোড করতে চাই:

this.router.navigate([`departments/${this.id}/employees`]);

কিন্তু কিছুই হয় না, কেন?


অনুরূপ প্রশ্নের এই উত্তরটি একবার দেখুন: stackoverflow.com/a/44580036/550975
সেরজ সাগান

উত্তর:


46

যদি আপনার নেভিগেট () ইতিমধ্যে আপনার ব্রাউজারের ঠিকানা বারে প্রদর্শিত URL টি পরিবর্তন না করে তবে রাউটারের কিছুই করার নেই। ডেটা রিফ্রেশ করা রাউটারের কাজ নয়। আপনি যদি ডেটা রিফ্রেশ করতে চান তবে উপাদানটিতে ইনজেকশনের একটি পরিষেবা তৈরি করুন এবং পরিষেবাটিতে লোড ফাংশনটি অনুরোধ করুন। নতুন ডেটা যদি পুনরুদ্ধার করা হয় তবে তা বাইন্ডিংয়ের মাধ্যমে ভিউটি আপডেট করবে।


2
এখন আপনি এটি বলছেন তবে আমি অবশ্যই রাজি হব ... কৌণিকটি ইউআই রাউটারের একটি পুনরায় লোড করার বিকল্প ছিল যাতে এইভাবে কোনও রুট পুনরায় লোড করা সমালোচনা করা হয় ;-) তবে হ্যাঁ আমি সেই টিপটির জন্য কেবল একটি পুনরায় লোড ডেটা থেক্স করতে পারলাম যা আসলে সুস্পষ্ট ...
পাস্কাল

83
আমি যদি রাজি না হয়ে গার্ডদের পুনরায় চালু করতে চাই, তবে কেউ যদি লগ আউট করে বলে তবে আমি কি তাতে রাজি নই?
জ্যাকি

1
@ জ্যাকি আমি ভেবেছিলাম যে সম্ভবত আপনি কেবল প্রহরীদের পুনরায় চালাতে পারবেন ... যদি তাদের মধ্যে পুনর্নির্দেশগুলি তৈরি করা থাকে তবে তা কৌশলটি করতে পারে।
ওল্ডটাইমগুইটারগুই

11
@ ইয়াকভফেইন দুঃখিত, তবে এটি মিথ্যা। এর অর্থ পথের আচরণের জন্য আপনার কাছে এখন সত্যের দুটি উত্স রয়েছে - একটি পাহারার সময় ঘটে অন্যটি উপাদানটিতে ঘটে। আপনি এখন কেবল সম্ভাব্য যুক্তিকেই নকল করছেন না, আপনি আরও প্রাকৃতিক ডেটা প্রবাহের বিরুদ্ধে লড়াই করছেন: ১. এপিআইতে পরিবর্তন করুন, ২. এপিআই থেকে তথ্য নতুন অবস্থানে আনার জন্য রুটকে রিফ্রেশ করুন, এপিআইকে সত্যের উত্স বানিয়েছেন। ব্যবহারকারীদের কোনও রুটটিকে ম্যানুয়ালি পুনরায় ট্রিগার করার ক্ষমতা না দেওয়ার সহজ কারণ নেই যাতে তথ্যের প্রাকৃতিক প্রবাহ আবার ঘটতে পারে।
অগলাউঞ্চার

4
আমি মনে করি না এটি একটি ভাল উত্তর। রাউটারটি আপনার ডেটার সত্যতার উত্স হওয়া উচিত। যদি আপনাকে এটিকে পৃথক পরিষেবার মাধ্যমে পুনরায় লোড করতে হয়, তবে রাউটারটি আর সর্বশেষতম সংস্করণ সম্পর্কে জানে না এবং আপনার উপাদানগুলি সত্যের উত্স হিসাবে আপনার রাউটারের উপর আর নির্ভর করতে পারে না।
ড্যান কিং

124

এটি এখন onSameUrlNavigationরাউটার কনফিগারেশনের সম্পত্তি ব্যবহার করে কৌণিক 5.1 এ করা যেতে পারে ।

আমি এখানে একটি ব্লগ যুক্ত করেছি যেখানে এটির সংক্ষিপ্ত বিবরণ নীচে দেওয়া হয়েছে as

https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

আপনার রাউটার কনফিগারেশন সক্ষম করুন onSameUrlNavigation বিকল্পে, এটি সেট করে 'reload'। আপনি ইতিমধ্যে সক্রিয় এমন কোনও রুটে নেভিগেট করার চেষ্টা করার সময় রাউটারটি ইভেন্টের চক্রটিকে আগুন ধরিয়ে দেয়।

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
 exports: [RouterModule],
 })

আপনার রুটের সংজ্ঞাগুলিতে সেট runGuardsAndResolversকরুনalways । এটি রাউটারকে সর্বদা প্রহরীদের এবং সমাধানকারী চক্রগুলি বন্ধ করতে বলবে, সম্পর্কিত ঘটনা গুলি চালিয়ে।

export const routes: Routes = [
 {
   path: 'invites',
   component: InviteComponent,
   children: [
     {
       path: '',
       loadChildren: './pages/invites/invites.module#InvitesModule',
     },
   ],
   canActivate: [AuthenticationGuard],
   runGuardsAndResolvers: 'always',
 }
]

অবশেষে, প্রতিটি উপাদান যা আপনি পুনরায় লোডিং সক্ষম করতে চান তাতে আপনার ইভেন্টগুলি পরিচালনা করতে হবে। এটি রাউটারটি আমদানি করে, ইভেন্টগুলিকে আবদ্ধ করে এবং একটি সূচনা পদ্ধতির সাহায্যে করা যেতে পারে যা আপনার উপাদানটির অবস্থা পুনরায় সেট করে এবং প্রয়োজনে ডাটা পুনরায় সংগ্রহ করে।

export class InviteComponent implements OnInit, OnDestroy {
 navigationSubscription;     

 constructor(
   // … your declarations here
   private router: Router,
 ) {
   // subscribe to the router events. Store the subscription so we can
   // unsubscribe later.
   this.navigationSubscription = this.router.events.subscribe((e: any) => {
     // If it is a NavigationEnd event re-initalise the component
     if (e instanceof NavigationEnd) {
       this.initialiseInvites();
     }
   });
 }

 initialiseInvites() {
   // Set default values and re-fetch any data you need.
 }

 ngOnDestroy() {
   if (this.navigationSubscription) {
     this.navigationSubscription.unsubscribe();
   }
 }
}

এই সমস্ত পদক্ষেপের জায়গায়, আপনার রুট পুনরায় লোডিং সক্ষম করা উচিত।


কোনও initফাংশন কল করার পরিবর্তে উপাদানটি পুনরায় লোড করার কোনও উপায় আছে ,
ইব্রাহিম আলরাবিয়া

আমি মনে করি না ... আপনি যদি রুট থেকে সরে গিয়ে আবার ফিরে না যান তবে। কোনও init ফাংশন বিশ্বের শেষ নয়, আপনি সূচনাটি বিন্দুতে নিয়ন্ত্রণ করতে পারেন যে উপাদানটি পুনরায় লোড করার মতো একই প্রভাব ফেলে। আপনি ছাড়া কোনও পুরো পুনরায় লোড করার কোনও বিশেষ কারণ আছে কি init?
সাইমন ম্যাকক্লাইভ

আমি আমার সমস্যার সমাধান খুঁজে পেয়েছি, আপনার প্রতিক্রিয়া এবং এটি কার্যকর হয়েছিল এমন ব্লগের জন্য আপনাকে ধন্যবাদ।
ইব্রাহিম আলারাবিয়া

উইন্ডো পুনরায় লোড ব্যতীত কৌনিক 4 এ এটি কীভাবে করা যায়।
বিশাখা

আমার Angular5 অ্যাপের জন্য দুর্দান্ত কাজ করে! এনজিওডেস্ট্রয় () এর সদস্যতা বাতিল করা অত্যন্ত গুরুত্বপূর্ণ - আপনি যখন এটি করবেন না আকর্ষণীয় :-)
ববসি

107

নিয়ামকটিতে এমন একটি ফাংশন তৈরি করুন যা প্রত্যাশিত রুটে পুনঃনির্দেশ করে

redirectTo(uri:string){
   this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
   this.router.navigate([uri]));
}

তারপরে এটি ব্যবহার করুন

this.redirectTo('//place your uri here');

এই ফাংশনটি ডামি রুটে পুনর্নির্দেশ করবে এবং ব্যবহারকারী এটি উপলব্ধি না করে গন্তব্য রুটে দ্রুত ফিরে আসবে।


3
ধন্যবাদ! এখানে সেরা সমাধান।
অ্যালান স্মিথ

এই সমাধানটি সূক্ষ্মভাবে কাজ করে, আমরা আরও ভাল না পাওয়া পর্যন্ত এটি ব্যবহার করতে পারি। ধন্যবাদ @ থিও।
সিবিশ ভেনু

12
এটি পরিবর্তনের মতো ব্যবহার '/'করে যখন আমি ব্যবহার করেছি'/DummyComponent'
suhailvs

1
ব্রাউজারের ইতিহাসে সমস্যা ছাড়াই, কৌণিক 7 এ কাজ করে। একটি নির্দিষ্ট উপাদানকে টার্গেট করার কারণে আমি এই সমাধানটি ব্যবহার করতে পছন্দ করেছি। আমার কাছে মনে হয় যে একই পৃষ্ঠাটি পুনরায় লোড করা সাধারণত একটি অস্বাভাবিক ঘটনা, সুতরাং পুরো অ্যাপ্লিকেশনটিকে একটি নির্দিষ্ট দৃষ্টান্ত অনুসরণ করতে ওভারকিলের মতো মনে হয়। অন্যান্য সমাধানের তুলনায় এটি প্রয়োগ করা সহজ এবং সহজ।
জেই কার্টার দ্বিতীয়

1
ঠিক আছে এটি কাজ করে তবে ... এটি আপনার হোম কম্পোনেন্টটি পুনরায় লোড করবে (বা "/" রুটে আপনার যা কিছু আছে), কিছুই করার জন্য এনজিওনিট / এনজিওনডাস্ট্রয়ের পুরো জীবনচক্রটি অতিক্রম করবে। কিছু ডামি এবং লাইটওয়েট উপাদান সহ একটি নির্দিষ্ট রুট রাখা ভাল বা আপনি
ল্যাগটি

77

সম্পাদনা

অ্যাঙ্গুলার (5.1+) এর নতুন সংস্করণগুলির জন্য @ সিমন ম্যাকক্লাইভ দ্বারা প্রস্তাবিত উত্তর ব্যবহার করুন

পুরানো উত্তর

আমি কৌনিকটির জন্য একটি গিটহাব বৈশিষ্ট্য অনুরোধে এই কার্যকারিতাটি পেয়েছি:

this._router.routeReuseStrategy.shouldReuseRoute = function(){
    return false;
};

this._router.events.subscribe((evt) => {
    if (evt instanceof NavigationEnd) {
        this._router.navigated = false;
        window.scrollTo(0, 0);
    }
});

আমি এটি আমার app.componal.ts ngOnInit ফাংশনে যুক্ত করার চেষ্টা করেছি এবং এটি অবশ্যই কাজ করেছে worked একই লিঙ্কে আরও সমস্ত ক্লিক এখন componentডেটা এবং ডেটা পুনরায় লোড করে ।

মূল গিটহাব বৈশিষ্ট্য অনুরোধের লিঙ্ক

ক্রেডিট গিটহাবের মিহাইকাক্স 2 এ যায় ।

আমি সংস্করণে আপনি এটি পরীক্ষিত 4.0.0-rc.3সঙ্গেimport { Router, NavigationEnd } from '@angular/router';


1
এটি কেবল কৌনিক 4.4.x এ চেষ্টা করে দেখুন এটি সম্পূর্ণরূপে কাজ করে। ধন্যবাদ!
মাইন্ডসেকট টিম

1
এটি আমার পক্ষে দুর্দান্ত কাজ করেছিল, যতক্ষণ না আমি আমার অ্যাপ্লিকেশনটিতে প্রতিটি প্যারেন্ট রুটের শিশুদের রুটে চলাচলের জন্য ম্যাটেরিয়ালের এনএভি-ট্যাব-বারটি প্রয়োগ করি না। ব্যবহারকারীরা এই কোডটি চালিত পৃষ্ঠায় হিট হয়ে গেলে অ্যানিমেটেড কালি বারটি অদৃশ্য হয়ে যাবে। (কেন? আমার কাছে ব্যাখ্যা করার মতো পর্যাপ্ত সময় বা স্থান নেই ...)
Andreisrob

3
এটি খুব খারাপ ধারণা - আপনার অ্যাক্টিভেটেডরউট এখন সর্বদা একই থাকবে।
আর্টুস্কা

1
@ অ্যান্টটিয়াগি আপনি কৌনিক 5.1+ এ থাকলে সাইমন এমসি ক্লাইভস সমাধানটি চেষ্টা করুন। হতে পারে এটি আপনার পক্ষে আরও ভাল কাজ করে।
Arg0n

2
খুব খারাপ ধারণা ... কারণ এটি একবার রুটরিউসস্ট্রেটজি.শোল্ডরিউসরউটি = মিথ্যা প্রয়োগ করে, তবে এটি উপাদান স্তরক্রমের প্রতিটি উপাদান লোড করবে। সুতরাং এর অর্থ আপনার প্রতিটি পিতা বা মাতা এবং সন্তানের উপাদান কোনও ইউআরএল পরিবর্তনের উপর পুনরায় লোড শুরু করে। সুতরাং এই ফ্রেমওয়ার্কটি ব্যবহার করার কোনও অর্থ নেই।
পিএসবাবুওয়ালা

27

সামান্য কৌশল: কিছু ডামি প্যারাম সহ একই পাথ ব্যবহার করুন। উদাহরণ স্বরূপ-

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}

12
এখন: this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });এবং route.queryParams.subscribe(val => myRefreshMethod())কোথায় route: ActivatedRouteসতেজ উপাদানগুলিতে ইনজেকশন দেওয়া হচ্ছে ... আশা করি এটি সহায়তা করবে
ইনসান-ই

4
বর্তমানে কৌনিক 7 এ এটি আর কাজ করে না বলে মনে হয়। কেউ কি নিশ্চিত করতে পারেন, বা আমি কিছু ভুল করছি? (আমি ইনস-ই এর সামান্যতম প্রকরণের চেষ্টাও করেছি))
পবারানিস

2
একটু কুৎসিত হতে পারে।
ড্যাববিবি।

19

আমি এটিকে একটি কৌণিক 9 প্রকল্পের জন্য ব্যবহার করছি:

reloadCurrentRoute() {
    let currentUrl = this.router.url;
    this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
        this.router.navigate([currentUrl]);
    });
}

PS: পরীক্ষিত এবং "কৌণিক 7, 8" এও কাজ করে


আমি ভেবেছিলাম আমি এই সমাধানটি নিয়ে আমার অভিজ্ঞতার মুখোমুখি হব। আমার কাছে মনে হচ্ছে এই রুটের সাথে যুক্ত পুরো উপাদানটি পুনরায় লোড করা হয়েছে। আমার পরিস্থিতিতে নিয়মিত রাউটার.নভিগেট করুন বিভিন্ন রাউটিং প্যারামের সাহায্যে উপাদানটি লোড থাকবে এবং কেবলমাত্র এনজিওইনাইট (রুটের প্যারামের উপর ভিত্তি করে) থেকে নতুন পরিবর্তনগুলি লোড করবে। আপনার সমাধানটি এটি করে নি বলে মনে হচ্ছে না, এটি পুরো উপাদানটিকে পুনরায় লোড করে এবং তারপরে রুটের প্যারামের উপর ভিত্তি করে এটি এনজিওইনাইটে পরিবর্তন আনবে বলে মনে হচ্ছে। যাইহোক, এটি আমার পরিস্থিতিতে আমার জন্য সামান্য অসুবিধা এবং আপনার সমাধান আমার প্রয়োজনের জন্য কাজ করে।
ইভান সেভি

তোমাকে ধন্যবাদ. পুরোপুরি কাজ করে।
সন্তোষ

17

কৌণিক 2-4 রুট পুনরায় লোড হ্যাক

আমার জন্য, একটি রুট উপাদান (উপাদান, যা কোনও রুটে উপস্থিত) এর ভিতরে এই পদ্ধতিটি ব্যবহার করে কাজ করে:

onRefresh() {
  this.router.routeReuseStrategy.shouldReuseRoute = function(){return false;};

  let currentUrl = this.router.url + '?';

  this.router.navigateByUrl(currentUrl)
    .then(() => {
      this.router.navigated = false;
      this.router.navigate([this.router.url]);
    });
  }

এই পদ্ধতির সাথে সতর্ক থাকুন, এটি বিশ্বব্যাপী রাউটার আচরণকে প্রভাবিত করবে (শিশু রুটের মধ্যে নেভিগেট করার সময় প্যারেন্ট রুট সর্বদা পুনরায় লোড হবে)।
seidme

16

এটি আমার জন্য কবজির মতো কাজ করে

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));

3
এটি সহজ উত্তর। আমি যদি এটি করতে পারি তবে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করব। গৃহীত উত্তরের বিপরীতে, এমন পরিস্থিতিতে থাকতে পারে যেখানে আপনাকে কোনও পৃষ্ঠায় ব্যবহৃত প্রতিটি উপাদান পুনরায় লোড করতে হবে এবং পৃথকভাবে প্রত্যেকে পুনরায় লোড করতে হবে, যা বিভিন্ন রুটে হতে পারে, এমনকি কোনও পরিষেবার মাধ্যমে ওভারকিলও হতে পারে।
অ্যান্ড্রু জুনিয়র হাওয়ার্ড

8

পরম পরিবর্তনে পুনরায় লোড পৃষ্ঠাটি ঘটবে না। এটি সত্যিই ভাল বৈশিষ্ট্য। পৃষ্ঠাটি পুনরায় লোড করার দরকার নেই তবে আমাদের উপাদানটির মান পরিবর্তন করা উচিত। প্যারাম চেঞ্জ পদ্ধতিটি ইউআরএল পরিবর্তনের জন্য কল করবে। সুতরাং আমরা উপাদান তথ্য আপডেট করতে পারেন

/product/: id / details

import { ActivatedRoute, Params, Router } from ‘@angular/router’;

export class ProductDetailsComponent implements OnInit {

constructor(private route: ActivatedRoute, private router: Router) {
    this.route.params.subscribe(params => {
        this.paramsChange(params.id);
    });
}

// Call this method on page change

ngOnInit() {

}

// Call this method on change of the param
paramsChange(id) {

}

8

এটি আমি কৌনিক 9 এর সাথে করেছি । আমি নিশ্চিত না যে এটি পুরানো সংস্করণগুলিতে কাজ করে।

আপনাকে যখন পুনরায় লোড করার প্রয়োজন হবে তখন আপনাকে এই কল করতে হবে।

 this.router.navigate([], {
    skipLocationChange: true,
    queryParamsHandling: 'merge' //== if you need to keep queryParams
  })

রুটারের রাউটারে সেমিউরাল নেভিগেশনটি 'পুনরায় লোড' করতে সেট করা দরকার

 RouterModule.forRoot(appRoutes, {
  // ..
  onSameUrlNavigation: 'reload',
  // ..
})

এবং আপনার প্রতিটি রুটে রানগার্ডস এবং রিসার্ভারগুলি 'সর্বদা' সেট করা দরকার

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},

1
এটা সঠিক উত্তর. "অনসেমরাল নেভিগেশন" অ্যাঙ্গুলার 5 থেকে কাজ করে Please দয়া করে এটিকে শীর্ষে স্থানান্তরিত করতে আপলোড করুন
ইয়ারোস্লাভ

এটি আমার পক্ষে কাজ করে না। অ্যান্ড্রিস নীচে করেছে। যদিও অ্যান্ড্রিসের পুনরায় লোডিং একটি আসল নিয়মিত রুটের নেভিগেশনের মতো 'পরিষ্কার' নয়। এটি পুরো পৃষ্ঠাটি পুনরায় লোড করবে বলে মনে হচ্ছে না, তবে মনে হচ্ছে এটি রুটের সাথে যুক্ত পুরো উপাদানটিকে পুনরায় লোড করবে। রুট প্যারামিটারের উপর ভিত্তি করে পুনরায় লোড করার জন্য আমার কেবলমাত্র শিশু উপাদানগুলির দরকার ছিল, রুটের সাথে সম্পর্কিত পুরো উপাদানটি নয়। যাইহোক, এটি যথেষ্ট ভাল কাজ করে। ভেবেছিলাম আমি আমার অভিজ্ঞতার কথা বলব।
ইভান সেভি

4

আমার জন্য হার্ডকডিং কাজ করে

this.router.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};

1
প্রস্তাবিত নয়! লোকেরা এই এসও জুড়ে এই সমাধানটিকে বিভিন্ন উপায়ে পুনরায় পোস্ট করতে থাকে। হ্যাঁ এটি আপনার তাত্ক্ষণিক সমস্যার সমাধান করতে পারে তবে আপনি পরে এটি ভুলে যাবেন যে আপনি এটি প্রয়োগ করেছেন এবং আপনার অ্যাপটি কেন উদ্ভট আচরণ করছে তা জানার জন্য আপনি কয়েক ঘন্টা ব্যয় করবেন spending
হেলজগেট

আপনার যদি অবশ্যই এটি আব্রাহিম আলরাবী সমাধানটি ব্যবহার করতে পারেন এবং কেবলমাত্র এটি একটি একক রুটে প্রয়োগ করুন।
হেলজগেট

4

যতদূর আমি জানি এটি কৌণিক 2 এ রাউটার দিয়ে করা যায় না তবে আপনি কেবল এটি করতে পারেন:

window.location.href = window.location.href

ভিউটি পুনরায় লোড করতে।


3
এটি কেবলমাত্র বর্তমান রুটকেই নয় পুরো অ্যাপ্লিকেশনটিকে সতেজ করে তোলে!
রোস্টামিণী

@ হেলো ওয়ার্ল্ড - কৌণিক 7 এ এভাবে যুক্তি কোথায় রাখবেন?
Pra_A

কোন কৌণিক সংস্করণ এটি বিবেচনা করে না - এটি কেবল নিয়মিত জেএস কোড
হ্যালো ওয়ার্ল্ড

ক্লিক করুন ফাংশন এ রাখুন। window.location.href = '/' বা '/ লগইন' যা অ্যাপ-রাউটিং.মডিউল.টস এর ভিতরে সর্বদা সংজ্ঞায়িত হয়। আমার ক্ষেত্রে যখন ব্যবহারকারী লগআউট করে এটি আবার লগইন স্ক্রিনে ফিরে যাওয়া উচিত তাই লগআউটে আমি সমস্ত লেখক ডেটা এবং সাফল্যে উইন্ডো.লোকেশন.ইরেফ = '/' ব্যবহার করি। এর অর্থ লোগিন পৃষ্ঠাটি পুনরায় লোড করুন এবং সমস্ত জাভাস্ক্রিপ্ট আবার পুনরায় চালু করুন। রুটের স্বাভাবিক পরিবর্তনের জন্য আমি এটির সুপারিশ করব না যেখানে ফাংশনগুলির পুনরায় কাজ প্রয়োজন হয় না।
আলী এক্সেলটার

আমি বিশ্বাস করি এটি আপনার এনজিআরএক্স স্টোরটিকে পুরোপুরি রিসেট করতে পারে - সুতরাং আপনি ইতিমধ্যে যে কোনও ডেটা সংগ্রহ করেছেন তা হারিয়ে যাবে।
জন কিউ

3

একটি দ্রুত এবং সরাসরি-সামনের-সামনের সমাধান খুঁজে পেয়েছে যার জন্য কৌণিকের অভ্যন্তরীণ কাজের সাথে টিঙ্কার প্রয়োজন হয় না:

মূলত: একই গন্তব্য মডিউল সহ কেবল একটি বিকল্প রুট তৈরি করুন এবং তাদের মধ্যে টগল করুন:

const routes: Routes = [
  {
    path: 'gesuch',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  },
  {
    path: 'gesuch-neu',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  }
];

এবং এখানে টগলিং মেনু:

<ul class="navigation">
    <li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
    <li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>

আশা করি এটা সাহায্য করবে :)


বিকল্প রুটে যদি প্যারামিটার থাকে এবং প্যারামিটার পরিবর্তিত হয় আপনি কী আবার লোড করতে চান?
মুকুস


2

আমার ক্ষেত্রে:

const navigationExtras: NavigationExtras = {
    queryParams: { 'param': val }
};

this.router.navigate([], navigationExtras);

কাজ সঠিক


2

রুট.নাভিগেট () এর জন্য পদ্ধতিতে অননিট প্রয়োগ করুন এবং কল করুন এনজিওনিট ()

একটি উদাহরণ দেখুন:

export class Component implements OnInit {

  constructor() {   }

  refresh() {
    this.router.navigate(['same-route-here']);
    this.ngOnInit();   }

  ngOnInit () {

  }

2

একটি ডামি উপাদান এবং এর জন্য রুট ব্যবহার করে অনুরূপ দৃশ্যের সমাধান করেছেন reload, যা আসলে একটি করে redirect। এটি স্পষ্টতই সমস্ত ব্যবহারকারীর পরিস্থিতিগুলি কভার করে না তবে কেবল আমার দৃশ্যের জন্য কাজ করেছে।

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Http } from '@angular/http';

@Component({
  selector: 'reload',
  template: `
    <h1>Reloading...</h1>
  `,
})
export class ReloadComponent implements OnInit{
  constructor(private router: Router, private route: ActivatedRoute) {
  }

  ngOnInit() {
    const url = this.route.snapshot.pathFromRoot.pop().url.map(u => u.path).join('/');
    this.router.navigateByUrl(url);
  }
}

ওয়াইল্ডকার্ড ব্যবহার করে সমস্ত url ধরতে রাউটিংটি তারযুক্ত:

import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { LoginViewComponent } from './views/login/login.component';
import { HomeViewComponent } from './views/home/home.component';
import { ReloadComponent } from './views/reload/reload.component';

@NgModule({
  declarations: [ 
    LoginViewComponent, HomeViewComponent, ReloadComponent
  ],
  imports: [
    RouterModule.forRoot([
      { path: 'login', component: LoginViewComponent },
      { path: 'home', component: HomeViewComponent },
      { 
        path: 'reload',
        children: [{
          path: '**',
          component: ReloadComponent 
        }]
      },
      { path: '**', redirectTo: 'login'}
    ])
  ],
  exports: [
    RouterModule,
  ],
  providers: [],

})
export class AppRoutingModule {}

এটি ব্যবহার করতে, আমাদের কেবল যে url যেতে চাইবে সেখানে আমাদের পুনরায় লোড যুক্ত করতে হবে:

  this.router.navigateByUrl('reload/some/route/again/fresh', {skipLocationChange: true})

2

বর্তমান রুটটি রিফ্রেশ করার জন্য বিভিন্ন পদ্ধতি রয়েছে

রাউটারের আচরণটি পরিবর্তন করুন (যেহেতু কৌণিক 5.1) রাউটারগুলিকে সেমউরাল নেভিগেশন সেট করুন 'পুনরায় লোড করুন'। এটি একই ইউআরএল নেভিগেশনে রাউটার ইভেন্টগুলি নির্গত করবে।

  • তারপরে আপনি কোনও রুটে সাবস্ক্রাইব করে এগুলি পরিচালনা করতে পারেন
  • পুনরায় সমাধানকারীদের পুনরায় চালিত করতে আপনি এটি রানগার্ডস এবং রিসোলভারগুলির সংমিশ্রণে ব্যবহার করতে পারেন

রাউটারটি ছোঁয়া ছাড়ুন

  • ইউআরএলে বর্তমান টাইমস্ট্যাম্পের সাথে একটি রিফ্রেশ ক্যোয়ারী পাস করুন এবং আপনার রাউন্ড উপাদানটিতে ক্যোয়ারীপ্যারামগুলিতে সাবস্ক্রাইব করুন।
  • রাউটার উপাদানটি ধরে রাখতে রাউটার-আউটলেটটির সক্রিয় ইভেন্টটি ব্যবহার করুন।

আমি https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e এর অধীনে আরও বিস্তারিত ব্যাখ্যা লিখেছি

আশাকরি এটা সাহায্য করবে.


1

ধরুন যে উপাদানটির রুটটি আপনি রিফ্রেশ করতে চান তা হ'ল view, তবে এটি ব্যবহার করুন:

this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
  if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
    return false;
  }
  return (future.routeConfig === curr.routeConfig);
}; 

debuggerনেভিগেট করার পরে সঠিক রুটটি কী আসবে তা জানতে আপনি পদ্ধতির অভ্যন্তরে একটি যোগ করতে পারেন "departments/:id/employees"


1

একটি সমাধান হ'ল ডামি প্যারামিটারটি পাস করা (অর্থাত সেকেন্ডের সময়), এইভাবে লিঙ্কটি সর্বদা পুনরায় লোড করা হয়:

this.router.navigate(["/url", {myRealData: RealData, dummyData: (new Date).getTime()}])

1

আমি ব্যবহার করছি setTimeoutএবং navigationByUrlএই সমস্যাটি সমাধান করার জন্য ... এবং এটি আমার পক্ষে ভাল কাজ করছে।

এটি অন্য ইউআরএলে পুনঃনির্দেশিত হয়েছে এবং পরিবর্তে বর্তমান ইউআরএলে আবার আসবে ...

 setTimeout(() => {
     this.router.navigateByUrl('/dashboard', {skipLocationChange: false}).then(() =>
           this.router.navigate([route]));
     }, 500)

1

আমি বিশ্বাস করি এটি এঙ্গুলার 6+ এ (স্থানীয়ভাবে) সমাধান হয়েছে; চেক

তবে এটি পুরো রুটের জন্য কাজ করে (এতে সমস্ত শিশু রুটও অন্তর্ভুক্ত)

আপনি যদি কোনও একক উপাদানকে লক্ষ্যবস্তু করতে চান তবে এখানে: কীভাবে পরিবর্তিত ক্যোয়ারী প্যারাম ব্যবহার করুন, আপনি যতবার চান ততবার নেভিগেট করতে পারবেন।

নেভিগেশন পয়েন্টে (শ্রেণি)

   this.router.navigate(['/route'], {
        queryParams: { 'refresh': Date.now() }
    });

যে উপাদানটিতে আপনি "রিফ্রেশ / পুনরায় লোড" করতে চান

// . . . Component Class Body

  $_route$: Subscription;
  constructor (private _route: ActivatedRoute) {}

  ngOnInit() {
    this.$_route$ = this._route.queryParams.subscribe(params => {
      if (params['refresh']) {
         // Do Something
         // Could be calling this.ngOnInit() PS: I Strongly advise against this
      }

    });
  }

  ngOnDestroy() {
    // Always unsubscribe to prevent memory leak and unexpected behavior
    this.$_route$.unsubscribe();
  }

// . . . End of Component Class Body

1

খুব হতাশাজনক যে অ্যাঙ্গুলার এখনও এর জন্য একটি ভাল সমাধান অন্তর্ভুক্ত বলে মনে হয় না। আমি এখানে একটি গিথুব ইস্যু উত্থাপন করেছি: https://github.com/angular/angular/issues/31843

এরই মধ্যে এটি আমার কাজের দিক থেকে। এটি উপরে প্রস্তাবিত অন্যান্য কয়েকটি সমাধানের উপর ভিত্তি করে, তবে আমি মনে করি এটি কিছুটা শক্ত। এর মধ্যে রাউটার পরিষেবাটিকে " ReloadRouter" র্যাপিংয়ের সাথে জড়িত রয়েছে , যা পুনরায় লোড কার্যকারিতার যত্ন নেয় এবং RELOAD_PLACEHOLDERমূল রাউটার কনফিগারেশনে একটি যুক্ত করে। এটি অন্তর্বর্তী নেভিগেশনের জন্য ব্যবহৃত হয় এবং অন্য কোনও রুট (বা রক্ষক) ট্রিগার এড়ায়।

দ্রষ্টব্য:ReloadRouter আপনি যখন পুনরায় লোড কার্যকারিতা চান তখন কেবল সেই ক্ষেত্রেগুলি ব্যবহার করুন । Routerঅন্যথায় সাধারণ ব্যবহার করুন ।

import { Injectable } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class ReloadRouter {
  constructor(public readonly router: Router) {
    router.config.unshift({ path: 'RELOAD_PLACEHOLDER' });
  }

  public navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {
    return this.router
      .navigateByUrl('/RELOAD_PLACEHOLDER', {skipLocationChange: true})
      .then(() => this.router.navigate(commands, extras));
  }
}

1

আমদানি Routerএবং ActivatedRouteথেকে@angular/router

import { ActivatedRoute, Router } from '@angular/router';

ইনজেকশন Routerএবং ActivatedRoute(আপনার ইউআরএল থেকে যদি কিছু প্রয়োজন হয়)

constructor(
    private router: Router,
    private route: ActivatedRoute,
) {}

ইউআরএল থেকে প্রয়োজনে যে কোনও প্যারামিটার পান।

const appointmentId = this.route.snapshot.paramMap.get('appointmentIdentifier');

একটি ডামি বা প্রধান ইউআরএলটিকে আসল url এ নেভিগেট করে একটি কৌশল ব্যবহার করে উপাদানটি রিফ্রেশ করবে।

this.router.navigateByUrl('/appointments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`appointment/${appointmentId}`])
});

তোমার ক্ষেত্রে

const id= this.route.snapshot.paramMap.get('id');
this.router.navigateByUrl('/departments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`departments/${id}/employees`]);
});

যদি আপনি একটি ডামি রুট ব্যবহার করেন তবে আপনি কোনও শিরোনাম পাওয়া url যদি কোনও url এর সাথে মেলে না তবে আপনি প্রয়োগ করেছেন যদি একটি শিরোনাম জ্বলজ্বলে 'না পাওয়া যায়' দেখতে পাবেন।


0

রুট প্যারামিটার পরিবর্তনগুলিতে সাবস্ক্রাইব করুন

    // parent param listener ie: "/:id"
    this.route.params.subscribe(params => {
        // do something on parent param change
        let parent_id = params['id']; // set slug
    });

    // child param listener ie: "/:id/:id"
    this.route.firstChild.params.subscribe(params => {
        // do something on child param change
        let child_id = params['id'];
    });

0

আপনি যদি রাউটার লিঙ্কের মাধ্যমে রুট পরিবর্তন করেন তবে এটি অনুসরণ করুন:

  constructor(public routerNavigate: Router){

         this.router.routeReuseStrategy.shouldReuseRoute = function () {
            return false;
          };

          this.router.events.subscribe((evt) => {

            if (evt instanceof NavigationEnd) {

                this.router.navigated = false;
             }
          })
      }

0

আপনার রাউটারমডুলে "onSameUrlNavication" বৈশিষ্ট্যটি ব্যবহার করা উচিত এবং তারপরে রাউটের ইভেন্টগুলিতে সাবস্ক্রাইব করুন https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e


একটি সমাধানের একটি লিঙ্ক স্বাগত, তবে দয়া করে আপনার উত্তরটি কার্যকর না হওয়া নিশ্চিত করুন: লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের কিছু ধারণা থাকতে পারে এটি কী এবং কেন এটি রয়েছে, তবে পৃষ্ঠার সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন ' লক্ষ্য পৃষ্ঠাটি অনুপলব্ধ ক্ষেত্রে লিঙ্কটি পুনরায় সংযুক্ত করুন। লিঙ্কের চেয়ে সামান্য বেশি উত্তরগুলি মুছতে পারে।
আলেসিও

0

রুটটি কখন সংরক্ষণ করতে হবে তা স্থির করে Dec

this.router.routeReuseStrategy.shouldReuseRoute = function () {
    return false;
};

এবং রাউটারের নেভিগেট করা মানকে মিথ্যাতে সেট করে, এটি দেখায় যে এই রুটটি কখনও রাউটেড হয়নি

this.mySubscription = this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        this.router.navigated = false;
    }
});

0

আমি কয়েকটি সংশোধন করার চেষ্টা করেছি এবং সেগুলির কোনওটিই কাজ করে না। আমার সংস্করণটি সহজ: ক্যোয়ারি প্যারামিটারগুলিতে একটি নতুন অব্যবহৃত প্যারামিটার যুক্ত করুন

            if (force) {
                let key = 'time';

                while (key in filter) {
                    key = '_' + key;
                }

                filter[key] = Date.now();
            }

            this.router.navigate(['.', { filter: JSON.stringify(filter) }]);

0

window.location.replace

// রুটটি বন্ধ করতে ব্যাকটিক ব্যবহার করুন

উইন্ডো.লোকেশন.রেপ্লেস ( departments/${this.id}/employees)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.