রাউটার নেভিগেট একই পৃষ্ঠাতে ngOnInit কল করে না


90

আমি router.navigateকিছু প্রশ্নের স্ট্রিং প্যারামিটার সহ একই পৃষ্ঠায় কল করছি । এই ক্ষেত্রে, ngOnInit()কল না। এটি কি পূর্বনির্ধারিত বা আমার অন্য কিছু যুক্ত করার দরকার আছে?

উত্তর:


139

আপনি ইনজেক্ট করতে পারেন ActivatedRouteএবং সাবস্ক্রাইব করতে পারেনparams

constructor(route:ActivatedRoute) {
  route.params.subscribe(val => {
    // put the code from `ngOnInit` here
  });
}

রাউটারটি কেবল যখন উপাদানটি অন্য কোনও রুটে নেভিগেট করে তখন উপাদানটি ধ্বংস করে এবং পুনরায় তৈরি করে। যখন কেবল রুটের প্যারাম বা ক্যোয়ারী প্যারামগুলি আপডেট হয় তবে রুটটি একই হয়, উপাদানটি ধ্বংস হবে এবং পুনরায় তৈরি করা হবে না।

উপাদানটিকে পুনরায় তৈরি করতে বাধ্য করার বিকল্প উপায় হ'ল একটি কাস্টম পুনরায় ব্যবহার কৌশল। একই ইউআরএল যখন বিভিন্ন পরামিতিগুলি লোড হয় তখন আবার কৌণিক 2 রাউটার 2.0.0 অংশগুলি পুনরায় লোড হচ্ছে না? (কীভাবে এটি বাস্তবায়ন করা যায় সে সম্পর্কে এখনও তেমন কোনও তথ্য উপলব্ধ নেই বলে মনে হয়)


4
এই সাবস্ক্রিপশনটি কাজ করছে না এটি কেবল আরম্ভ
করাতে শুরু করবে

@ ওয়ান্ডা ওয়েডামুল্লা যা আপনার কোডের সাথে নির্দিষ্ট specific যদিও আরও বিশদ ছাড়াই বলা
শক্ত

4
আপনারও এটি থেকে সদস্যতা ছাড়ার দরকার নেই বা এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয়েছে?
বৃষ্টি01

4
@ বৃষ্টি01 টি থাম্বের নিয়ম হিসাবে আপনি স্পষ্টভাবে সাবস্ক্রাইব করার সময় আপনার সিপিডিতে স্পষ্টতই সাবস্ক্রাইব করা উচিত। আপনার যদি আপনার মূল উপাদানটিতে উপরের কোড থাকে তবে সদস্যতা বাতিল করা অপ্রয়োজনীয় কারণ মূল উপাদানটির আজীবন সাধারণত পুরো কৌণিক অ্যাপ্লিকেশনটির জীবনকাল সমান হয়।
গন্টার জ্যাচবাউয়ার

এই সমাধান কাজ করে সঙ্গে মিলিত stackoverflow.com/a/47827668/5284473 (অথবা onSameUrlNavigation বিশ্বব্যাপী সেটিং)।
এস রুজ

106

আপনি রাউটারে পুনঃব্যবহার্য স্থির করতে পারেন।

constructor(private router: Router) {
    // override the route reuse strategy
    this.router.routeReuseStrategy.shouldReuseRoute = function() {
        return false;
    };
}

4
এটি পৃষ্ঠার প্রতিটি উপাদানগুলির এনজিআইএনটি শুরু করবে।
jforjs

4
ঠিক আছে, @ পাসল, আপনার উত্তরটি আপ-ভোট দেওয়ার জন্য আপনি আমাকে এসওতে লগ ইন করতে বাধ্য করেছিলেন। আমি যোগ হবে কৌণিক 6 আপনার কাছে যোগ করা আবশ্যক onSameUrlNavigation: 'reload'তাই মত কনফিগ বস্তু: RouterModule.forRoot(appRoutes, {onSameUrlNavigation: 'reload'})। যদিও অন্য কোনও কৌণিক সংস্করণের জন্য কৌতুক করবেন না।
হিলডি

4
@ হিল্ডি, আমিও এটি করতে বাধ্য হয়েছিল :) ধন্যবাদ @ পাসল! যদি আপনি ল্যাম্বডা পছন্দ করেন তবে আপনি এটি করতে পারেন rou
নিক

4
@Swaprks আমি একটি routing.module.ts তৈরি করেছেন এবং এই কন্সট্রাকটর যেমন কোড স্থাপন
পাসকাল

4
@ সোয়াব্রাক্স .. আমারও একই সমস্যা আছে এবং উপরে আপনার উত্তরটি চেষ্টা করে দেখতে চাই। তবে এটি আমাকে এই ক্ষেত্রে একজন শিক্ষানবিশ হিসাবে বেশি কিছু বলে না। ঠিক কোডটিতে আমি এই কোড টুকরোটি কোথায় রাখব? আমি কি কোড স্নিপেটে কিছু পরিবর্তন করার কথা বলছি (যেমন ´ ফাংশন ()?)? আপনি যদি রাউটিং.মডিউল.এস নামের সাথে একটি নতুন ফাইল তৈরি করেন তবে অন্য ফাইলগুলির সাথে কীভাবে ইন্টারেক্ট করার কথা রয়েছে? অ্যাপ-রুটিং নামে একটি ফাইল রয়েছে mod
এডএন

25

কৌণিক 9

আমি নিম্নলিখিতটি ব্যবহার করেছি এবং এটি কাজ করেছে।

onButtonClick() {
    this.router.routeReuseStrategy.shouldReuseRoute = function () {
        return false;
    }
    this.router.onSameUrlNavigation = 'reload';
    this.router.navigate('/myroute', { queryParams: { index: 1 } });
}

4
এছাড়াও, উপরের পরিবর্তে ল্যাম্বডাও ব্যবহার করুন, this.router.routeReuseStrategy.shouldReuseRoute = () => মিথ্যা;
ধওয়ানিল প্যাটেল

কৌণিক ৮. এ কাজ করে
কিশান বৈষ্ণব

4
এই অ্যাপ্লিকেশন জুড়ে রাউটার আচরণ পরিবর্তন করতে হবে বা এই নির্দিষ্ট জন্য একবার ট্রিগার navigate()?
হাফস্ট

কৌণিক 9 এ কাজ করে
Ilija Iličić

9

আপনার সম্ভবত পৃষ্ঠাটি পুনরায় লোড করার দরকার আছে? এটি আমার সমাধান: আমি @ এনজিএমডিউল পরিবর্তন করেছি ( আমার ক্ষেত্রে অ্যাপ-রাউটিং.মডিউল.টস ফাইল):

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

এখানে 'রুট' কী।
ধওয়ানিল প্যাটেল 26'20

@ ধওয়ানিলপ্যাটেল আপনার কৌণিক অ্যাপ রুটগুলি। উদাহরণস্বরূপ "কনস্ট্যান্ড রুটস: রুটস = ​​[{পাথ: 'ক্রাইসিস-সেন্টার', উপাদান: ক্রাইসিসিস্টলিস্ট কম্পোনেন্ট}, {পাথ: 'বীরাঙ্গন', উপাদান: হিরোলিস্টকোম্পোনটি
Dionis Oros

1

NgOnInitযখন একটি উদাহরণ তৈরি করা হবে একবার কল করা হবে। একই উদাহরণ NgOnInitহিসাবে আবার কল করা হবে না। এটিকে ডাকার জন্য এটি তৈরি করা দৃষ্টান্তটি ধ্বংস করা প্রয়োজন।


1

আপনার নেভিগেশন পদ্ধতিতে,

this.router.routeReuseStrategy.shouldReuseRoute = () => false;
this.router.onSameUrlNavigation = 'reload';
this.router.navigate(['/document'], {queryParams: {"search": currentSearch}});

1

আমার একই সমস্যা ছিল, অতিরিক্তভাবে আমি সতর্কতা পেয়েছি:

did you forget to call `ngZone.run()`

এই সাইটটি সেরা সমাধান সরবরাহ করেছে:

import { Router } from '@angular/router';
import { NgZone } from '@angular/core';

...

  constructor(
    private ngZone:NgZone,
    private _router: Router
  ){ }

  redirect(to) {
    // call with ngZone, so that ngOnOnit of component is called
    this.ngZone.run(()=>this._router.navigate([to]));
  }

এটি সম্পর্কে শ্রদ্ধার সাথে, আমি জানাতে চাই যে আপনি কীভাবে নতুন রুট দিয়ে পৃষ্ঠাটি রিফ্রেশ করবেন তখন কীভাবে সমস্যাটি পরিচালনা করবেন। সেক্ষেত্রে এনজিজোন সতর্কতা এখনও উপস্থিত থাকবে।
সিদ্ধন্ত

0

এই সমস্যাটি সম্ভবত এই বাস্তবতা থেকে আসছে যে আপনি এনজিওএনডেস্ট্রয় ব্যবহার করে আপনার সদস্যতাগুলি বন্ধ করছেন না। কীভাবে করা যায় তা এখানে।

  1. নিম্নলিখিত rxjs সাবস্ক্রিপশন আমদানি আনুন। import { Subscription } from 'rxjs/Subscription';

  2. আপনার কৌনিক কোর আমদানিতে অনডেস্টরি যুক্ত করুন। import { Component, OnDestroy, OnInit } from '@angular/core';

  3. আপনার এক্সপোর্ট ক্লাসে অনডেস্টরি যুক্ত করুন। export class DisplayComponent implements OnInit, OnDestroy {

  4. উপাদানটির প্রতিটি সাবস্ক্রিপশনের জন্য আপনার এক্সপোর্ট ক্লাসের অধীনে আরএক্সজেএস থেকে সাবস্ক্রিপশনের মান সহ একটি অবজেক্ট সম্পত্তি তৈরি করুন। myVariable: Subscription;

  5. আপনার সাবস্ক্রিপশনের মান MyVariable: সাবস্ক্রিপশনে সেট করুন। this.myVariable = this.rmanagerService.getRPDoc(books[i].books.id).subscribe(value => {});

  6. তারপরে এনজিওনাইটের নীচের অংশে এনজিওনডেস্টোরি () লাইফ চক্র হুক রাখুন এবং আপনার সাবস্ক্রিপশনের জন্য আপনার সদস্যতা রোধের বিবৃতি দিন। আপনার যদি একাধিক থাকে তবে আরও যুক্ত করুন ngOnDestroy() { this.myVariable.unsubscribe(); }


আমি নিজের ngOnDestoryপরিবর্তেও টাইপ করতে ngOnDestroyথাকি ;-)
সাইমন_উইভার

0

রুটের অ্যারেতে একই উপাদানটির জন্য একটি পৃথক পাথ তৈরি করুন।

কনস্ট রুটস: রুটস = ​​[{পথ: "অ্যাপ", উপাদান: মাই কম্পোম্পোনেন্ট onent, {পাথ: "অ্যাপ-রিলোড", উপাদান: মাই কম্পোম্পোনেন্ট}];

যদি বর্তমান ইউআরএল "অ্যাপ" হয় তবে "অ্যাপ্লিকেশন-রিলোড" এবং তদ্বিপরীত ব্যবহার করে নেভিগেট করুন।


0

এখানে আরও তথ্যের সাথে এই পৃষ্ঠায় সেরা ধারণাগুলির একটি সংগ্রহ রয়েছে

সমাধান 1 - প্যারাম সাবস্ক্রিপশন ব্যবহার করুন:

টিউটোরিয়াল: https://angular-2-training-book.rangle.io/routing/routeparams#reading-route-paraters

দস্তাবেজ: https://angular.io/api/router/ActivatedRoute#params

আপনার প্রতিটি রাউটিং উপাদান যা প্যারাম ভেরিয়েবল ব্যবহার করে সেগুলিতে নিম্নলিখিতটি অন্তর্ভুক্ত থাকে:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';

// ...

@Component({
    // ...
})
export class MyComponent implements OnInit, OnDestroy {
    paramsSub: Subscription;

    // ...

    constructor(activeRoute: ActivatedRoute) {

    }

    public ngOnInit(): void {
        // ...
        this.paramsSub = this.activeRoute.params.subscribe(val => {
            // Handle param values here
        });

        // ...
    }

    // ...

    public ngOnDestroy(): void {
        // Prevent memory leaks
        this.paramsSub.unsubscribe();
    }
}

এই কোডটির সাথে কিছু সাধারণ সমস্যা হ'ল সাবস্ক্রিপশনগুলি অ্যাসিনক্রোনাস এবং এটি মোকাবেলা করার জন্য কৌশলযুক্ত হতে পারে। এছাড়াও আপনি এনজিওডেস্ট্রয় সাবস্ক্রাইব করতে ভুলবেন না অন্যথায় খারাপ জিনিসগুলি ঘটতে পারে।

ভাল জিনিস হ'ল এই সমস্যাটি পরিচালনা করার জন্য এটি সবচেয়ে নথিভুক্ত এবং সাধারণ উপায়। আপনি এই পৃষ্ঠায় প্রতিবার দেখার সময় প্রতিবার টেমপ্লেটটি ধ্বংস এবং পুনরুদ্ধার করার পরিবর্তে টেম্পলেটটি পুনরায় ব্যবহার করছেন এমনভাবে এটির একটি পারফরম্যান্স উন্নতিও ঘটছে।

সমাধান 2 - উচিতআমি ব্যবহার করুন / অন সেমউরাল নেভিগেশন:

দস্তাবেজ: https://angular.io/api/router/ExtraOptions#onSameUrl নেভিগেশন

দস্তাবেজ: https://angular.io/api/router/RouteReuseStrategy#shouldReuseRoute

দস্তাবেজ: https://angular.io/api/router/ActtivatedRouteSnapshot#params

RouterModule.forRootআপনার প্রকল্পে কোথায় অবস্থিত তা সন্ধান করুন (সাধারণত অ্যাপ-রাউটিং.মডিউল.টস বা অ্যাপ্লিকেশন.মডিউল.টগুলিতে পাওয়া যায়):

const routes: Routes = [
   // ...
];

// ...

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

তারপরে অ্যাপকোম্পোন্টে নিম্নলিখিতগুলি যুক্ত করুন:

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

// ...
@Component({
    // ...
})
export class AppComponent implements OnInit {
    constructor(private router: Router) {
    }

    ngOnInit() {
        // Allows for ngOnInit to be called on routing to the same routing Component since we will never reuse a route
        this.router.routeReuseStrategy.shouldReuseRoute = function() {
            return false;
        };

        // ...
    }

    // ...
}

সর্বশেষে, আপনার রাউটিং উপাদানগুলিতে আপনি এখন এই জাতীয় প্যারাম ভেরিয়েবলগুলি পরিচালনা করতে পারবেন:

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

// ...

@Component({
    // ...
})
export class MyComponent implements OnInit {
    // ...

    constructor(activeRoute: ActivatedRoute) {

    }

    public ngOnInit(): void {
        // Handle params
        const params = +this.activeRoute.snapshot.params;

        // ...
    }

    // ...
}

এই সমাধান সহ সাধারণ সমস্যাগুলি হ'ল এটি সাধারণ নয়। এছাড়াও আপনি কৌণিক কাঠামোর ডিফল্ট আচরণ পরিবর্তন করছেন, যাতে আপনি সাধারণত যে বিষয়গুলিতে লোকেদের মধ্যে চালিত না হয় সেগুলিতে চলে যেতে পারেন।

ভাল জিনিস হ'ল আপনার সমস্ত কোড সিঙ্ক্রোনাস এবং বুঝতে সহজ।


-1

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


4
সত্যিই তা ঘটে না
নাদব

-7

আপনি যখন একই পৃষ্ঠায় রাউটার নেভিগেট করতে চান এবং ngOnInit () কল করতে চান, তাই আপনি যেমন যেমন করেন,

this.router।

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