কৌণিক 2 routeচ্ছিক রুটের পরামিতি


180

কৌণিক 2 রুটে alচ্ছিক রুট পরামিতি থাকা কি সম্ভব? আমি রুটকনফাইগে অ্যাঙ্গুলার 1.x সিনট্যাক্স চেষ্টা করেছি তবে ত্রুটির নীচে পেয়েছি:

"মৌলিক উত্সাহ: পথ" / ব্যবহারকারী /: আইডি? "এতে"? "রয়েছে যা একটি রুট কনফিগারেশনে অনুমোদিত নয়।"

@RouteConfig([
{
    path: '/user/:id?',
    component: User,
    as: 'User'
}])

উত্তর:


297

আপনি পরামিতি সহ এবং ছাড়াই একাধিক রুট সংজ্ঞায়িত করতে পারেন:

@RouteConfig([
    { path: '/user/:id', component: User, name: 'User' },
    { path: '/user', component: User, name: 'Usernew' }
])

এবং আপনার উপাদানটিতে theচ্ছিক প্যারামিটারটি পরিচালনা করুন:

constructor(params: RouteParams) {
    var paramId = params.get("id");

    if (paramId) {
        ...
    }
}

সম্পর্কিত গিথুব ইস্যুটিও দেখুন: https://github.com/angular/angular/issues/3525


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

10
এই সমাধান এখনও প্রয়োগ করা হয়? আমি লক্ষ্য করেছি যে "ব্যবহারকারীর" থেকে "ইউজারউইউ" তে চলে যাওয়া 'ইউজার' উপাদানটি পুনরায় ইনস্ট্যান্ট করবে
টেলিভিজ

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

4
@Teleaziz দ্বারা উল্লিখিত হিসাবে, পরামিতি যুক্ত করা উপাদানটিকে পুনরায় রেন্ডার করবে। এটি এড়াতে মার্টিন ক্রিমারের উত্তর; ফাঁকা প্যারামিটার মান সহ একটি 'রিডাইরেক্টটো' রুট যুক্ত করে আমার জন্য দুর্দান্ত কাজ করেছে: stackoverflow.com/a/49159166/1364650 - তবে এটি বেশ হ্যাকি, আমি মনে করি তাদের কেবলমাত্র routeচ্ছিক রুটের পরামিতিগুলি সঠিকভাবে সমর্থন করা উচিত।
ভিনসেন্ট সেলস

2
যারা RouteParamsউপাদান কেন আমদানি করছেন না তা ভাবছেন তাদের জন্য : স্ট্যাকওভারফ্লো . com / a / 36792261 / 806202 । সমাধানটি ব্যবহার করার জন্য ActivatedRoute:route.snapshot.params['routeParam']
আর্সেন খাচাতুরিয়ান

89
{path: 'users', redirectTo: 'users/', pathMatch: 'full'},
{path: 'users/:userId', component: UserComponent}

প্যারামিটার যুক্ত হওয়ার পরে এই উপাদানটি পুনরায় রেন্ডার হয় না।


6
এই উত্তরটি সেরা। এটি একই উপাদানটিকে পুনরায় রেন্ডার করে না এবং এর জন্য একাধিক উপাদানগুলির প্রয়োজন হয় না।
রেক্স

4
সর্বোত্তম উত্তর, তবে আমি pathMatch: 'full'পুনঃনির্দেশে যুক্ত করেছি, অন্যথায় মত পথগুলি users/adminআমার ক্ষেত্রেও পুনঃনির্দেশিত হয়েছে
ভ্যালারি কাটকভ

4
এই উত্তরটি কেবলমাত্র সেরা যদি আপনি ব্রাউজারে দেখা হিসাবে আপনার ইউআরএল উপর ট্র্যাশিং স্ল্যাশ ঠিক আছে। সম্ভবত এমন একটি মান বিবেচনা করুন যা 'একটি অপরিবর্তিত আইডি' উপস্থাপন করে, উদাহরণস্বরূপ /users/allবা /users/home, 'সমস্ত' বা 'হোম' হিসাবে এটি পড়ুন idএবং এটি যদি আপনার যাদু মানের সাথে মেলে তবে কেবল এটিকে উপেক্ষা করুন। তারপরে উপরের প্রথম লাইনটি হয়ে যায় redirectTo: 'users/home'বা যা আপনি সিদ্ধান্ত নেন । আমার কাছে একটি পিছনে স্ল্যাশ সত্যিই কিছু ভুল হওয়ার কারণ হিসাবে দাঁড়িয়েছে।
সাইমন_উইভার

@ সিমন_আমি যাই হোক না কেন আমি সম্মত হই। ম্যাচার ব্যবহার করে আমি আরও একটি সমাধান পেয়েছি যার মধ্যে এই সমস্যাটি নেই: stackoverflow.com/a/56391974/664533
ওয়েন মুরার

1
এটি একটি সাধারণ বানান তবে বেশ অটুট: ডি সেরা সমাধান!
ভেরি

45

তথ্য alচ্ছিক হলে ক্যোয়ারি প্যারামিটার ব্যবহার করার পরামর্শ দেওয়া হয়।

রুট প্যারামিটার বা কোয়েরি প্যারামিটার?

কোন ধরাবাঁধা নিয়ম নেই. সাধারণভাবে,

যখন একটি রুট পরামিতি পছন্দ

  • মান প্রয়োজন।
  • অন্যটি থেকে একটি রুটের পাথ পৃথক করতে মানটি প্রয়োজনীয়।

যখন একটি কোয়েরি পরামিতি পছন্দ

  • মান alচ্ছিক।
  • মান জটিল এবং / বা বহু-বৈচিত্র্য।

https://angular.io/guide/router#optional-route-paraters থেকে

আপনাকে কেবল রুটের পথ থেকে প্যারামিটারটি বের করতে হবে।

@RouteConfig([
{
    path: '/user/',
    component: User,
    as: 'User'
}])

6
Routeচ্ছিক রুট প্যারামগুলি পরিবর্তন করে উপাদানগুলি পুনরায় সরবরাহ করে তবে কোয়েরিপ্যারামগুলি পরিবর্তন করে না। এছাড়াও আপনি যদি রুট নেভিগেশনের আগে কিছু ডেটা সমাধান করেন তবে আপনি যখন optionচ্ছিক রুটের প্যারামগুলি পরিবর্তন করবেন তখন প্রতিবারই এটির জন্য অনুরোধ করা হবে।
রাখাত

1
এফওয়াইআই, সেই অ্যাঙ্কর লিঙ্কটি আর কাজ করে না। নতুন লিঙ্কটি রুট পরামিতি
স্পটেডমাহ্ন

20

কৌণিক 4 - paraচ্ছিক প্যারামিটারের ক্রমটির সমাধান করার সমাধান:

এটা কর:

const appRoutes: Routes = [
  {path: '', component: HomeComponent},
  {path: 'products', component: ProductsComponent},
  {path: 'products/:id', component: ProductsComponent}
]

নোট করুন যে productsএবংproducts/:id রুটগুলি ঠিক একই নামকরণ করা হয়েছে কৌণিক 4 সঠিকভাবে productsকোনও পরামিতি ছাড়াই অনুসরণ করবে এবং যদি কোনও পরামিতি অনুসরণ করে products/:id

তবে, পরামিতিবিহীন রুটের পাথ productsঅবশ্যই আবশ্যক পিছনের স্ল্যাশ থাকা নয় , অন্যথায় কৌণিক এটি ভুলভাবে প্যারামিটার-পাথ হিসাবে বিবেচনা করবে। সুতরাং আমার ক্ষেত্রে, পণ্যগুলির জন্য আমার পিছনে স্ল্যাশ ছিল এবং এটি কার্যকর হয়নি।

এটি করবেন না:

...
{path: 'products/', component: ProductsComponent},
{path: 'products/:id', component: ProductsComponent},
...

যদি উভয়ই প্রোডাক্ট কম্পোনেন্টে চলে যায়, আপনি কীভাবে সেখানে alচ্ছিক প্যারামিটারটি ব্যবহার করবেন?
অরউইন

1
আপনি: আইডি 1,: আইডি 2, ইত্যাদি প্যারামিটারগুলির পাশাপাশি প্রোডাক্ট কম্পোনেন্টে অনুরোধ করা ইউআরএল যেমন: এই.আরউটি.আরল.ফর্স্ট () .সম্প্রাপম্যাপ ((url) => {// কনসোল.লগ ('1: ইউআরএল পরিবর্তন সনাক্ত করেছে '+ ইউআরএল); ফেরান this.route.params.do ((প্যারামস) => {// কনসোল.লগ (' 2: ইউআরএল + প্যারাম পরিবর্তনগুলি সনাক্ত হয়েছে '+ প্যারাম ["আইডি 1"] +' '+ প্যারাম ["id2"]); this.id1 = params ["id1"]; this.id2 = params ["id2"];})})
উদ্দেশ্য

2
মনে রাখবেন আপনি dataউপাদানটিতেও যেতে পারেন, যা প্রতিটি রুটের জন্য একই উপাদান পর্যন্ত আলাদা হতে পারে। উদাহরণ {path: 'products', component: ProductsComponent, data: { showAllProducts: true} },ব্যবহার করা যেতে পারে এবং তারপরে আপনি যাচাই করে নিন showAllProducts। কিছুটা ভাল তারপর একটি নাল জন্য চেক, কিন্তু সাধারণ ক্ষেত্রে সম্ভবত হয় ভাল।
সাইমন_উইভার

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

@ কোডিয়াক - আমি বিশ্বাস করি না যে এটি সঠিক। আমার বোধগম্যতা হল যে অ্যাপ্লিকেশন.মডিউল.টায়, পণ্যসংশ্লিষ্ট একবার ইনস্ট্যান্ট করা হয়, এবং কৌণিক ইঞ্জিন প্রতিটি নাব্যযোগ্য ইভেন্টের (পণ্য এবং পণ্য /: আইডি ইত্যাদি) উপর সেই ইনস্ট্যান্টেটেড প্রোডাক্ট কম্পোনেন্টটিকে পুনরায় ব্যবহার করে। আপনি কি ব্যাখ্যা বা প্রদর্শন করতে পারেন যে কীভাবে প্রোডাক্টস কম্পোনেন্টটি উপরের কোডটিতে পুনরায় ইনস্ট্যান্ট করতে পারে এবং আপনি কীভাবে পুনঃ-ইনস্ট্যান্টেশন প্রতিরোধ করবেন?
উদ্দেশ্যটিসিটি

11

রিরেজের উত্তরটি বেশ সুন্দর তবে এর একটি গুরুতর ত্রুটি রয়েছে। এটি Userউপাদানটি পুনরায় চালিত করার ngOnInitপদ্ধতি তৈরি করে।

আপনি যখন সেখানে কিছু ভারী জিনিস করেন তখন সমস্যা হতে পারে এবং আপনি যখন প্যারামিমেট্রিক নন থেকে প্যারামিমেট্রিকটিতে স্যুইচ করেন তখন এটি পুনরায় চালিত হওয়া চাই না। যদিও এই দুটি রুটগুলি একটি optionচ্ছিক ইউআরএল প্যারামিটার অনুকরণ করার জন্য বোঝানো হয়েছে তবে 2 টি পৃথক রুট হয়ে উঠবে না।

সমস্যাটি সমাধান করার জন্য আমি যা পরামর্শ দিচ্ছি তা এখানে:

const routes = [
  {
    path: '/user',
    component: User,
    children: [
      { path: ':id', component: UserWithParam, name: 'Usernew' }
    ]
  }
];

তারপরে আপনি পরমকে UserWithParamউপাদানটিতে পরিচালনা করার জন্য দায়ীকে যুক্ত করতে পারেন এবং উপাদানটিতে বেস লজিকটি রেখে যেতে পারেন User। আপনি / ব্যবহারকারী থেকে / ব্যবহারকারী / 123 এUser::ngOnInit নেভিগেট করলে আপনি যা কিছু করেন তা আর চালানো হবে না ।

লাগাতে ভুলবেন না <router-outlet></router-outlet>মধ্যে Userএর টেমপ্লেট।


উপাদানটি পুনরায় তৈরি করা এড়ানো ভাল কাজ যদি পারফরম্যান্স সমালোচনা হয়। আমার কাছে আরও একটি সমাধান রয়েছে যা উপাদানটিকে পুনরায় তৈরি করা এড়ানো এড়িয়ে যায়: স্ট্যাকওভারফ্লো.com
ওয়েন মুরার

4

এখানে প্রস্তাবিত উত্তরগুলি সহ, রিরেজ থেকে গৃহীত উত্তরগুলি সহ একাধিক রুট এন্ট্রি যুক্ত করার পরামর্শ দেয়।

তবে রুট এন্ট্রিগুলির মধ্যে পরিবর্তন করার সময় উপাদানটি পুনরায় তৈরি করা হবে, অর্থাত প্যারামিটার সহ রুট প্রবেশ এবং পরামিতি ছাড়াই প্রবেশের মধ্যে।

আপনি যদি এড়াতে চান তবে আপনি নিজের রুট ম্যাচার তৈরি করতে পারেন যা উভয় রুটের সাথে মিলবে:

export function userPageMatcher(segments: UrlSegment[]): UrlMatchResult {
    if (segments.length > 0 && segments[0].path === 'user') {
        if (segments.length === 1) {
            return {
                consumed: segments,
                posParams: {},
            };
        }
        if (segments.length === 2) {
            return {
                consumed: segments,
                posParams: { id: segments[1] },
            };
        }
        return <UrlMatchResult>(null as any);
    }
    return <UrlMatchResult>(null as any);
 }

তারপরে আপনার রুট কনফিগারেশনে ম্যাচারটি ব্যবহার করুন:

const routes: Routes = [
    {
        matcher: userPageMatcher,
        component: User,
    }
];

@ কেভিনবিল আমি বেশ কয়েকটি ম্যাচচার প্রয়োগ করেছি যা এওটির সাথে কাজ করে। আপনি এখানে পাচ্ছেন ত্রুটি কি?
ওয়েইন ম্যুরার

উফ। এটা অন্য কিছু ছিল। আমার ম্যাথার এওটির সাথে কাজ করে।
কেভিন বিয়াল

এটি সামান্য
কৌশলযুক্ত তবে

4

কৌণিক 4 সহ আমাদের কেবল শ্রেণিবদ্ধভাবে রুটগুলি একসাথে সাজানো দরকার

const appRoutes: Routes = [
  { 
    path: '', 
    component: MainPageComponent 
  },
  { 
    path: 'car/details', 
    component: CarDetailsComponent 
  },
  { 
    path: 'car/details/platforms-products', 
    component: CarProductsComponent 
  },
  { 
    path: 'car/details/:id', 
    component: CadDetailsComponent 
  },
  { 
    path: 'car/details/:id/platforms-products', 
    component: CarProductsComponent 
  }
];

এটি আমার পক্ষে কাজ করে। এই রাউটারটি অপশন আইডি পরামিতিগুলির উপর নির্ভর করে পরবর্তী রুটটি কী তা জানেন।


1

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

পিতামাতার কাছ থেকে অ্যাপ-রাউটিং

...
const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: 'pathOne',
        loadChildren: 'app/views/$MODULE_PATH.module#PathOneModule'
      },
      {
        path: 'pathTwo',
        loadChildren: 'app/views/$MODULE_PATH.module#PathTwoModule'
      },
...

শিশু পথ অলস বোঝা

...
const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: '',
        component: OverviewComponent
      },
      {
        path: ':id',
        component: DetailedComponent
      },
    ]
  }
];
...

0

আমি মন্তব্য করতে পারি না, তবে এর প্রসঙ্গে: কৌণিক 2 optionচ্ছিক রুট প্যারামিটার

কৌণিক 6 এর জন্য একটি আপডেট:

import {map} from "rxjs/operators"

constructor(route: ActivatedRoute) {
  let paramId = route.params.pipe(map(p => p.id));

  if (paramId) {
    ...
  }
}

অ্যাঙ্গুলার 6 রাউটিংয়ের অতিরিক্ত তথ্যের জন্য https://angular.io/api/router/ActivatedRoute দেখুন ।


0

অলস লোডিংয়ের সাথে একই ধরণের সমস্যার মুখোমুখি হয়ে আমি এটি করেছি:

const routes: Routes = [
  {
    path: 'users',
    redirectTo: 'users/',
    pathMatch: 'full'
  },
  {
    path: 'users',
    loadChildren: './users/users.module#UserssModule',
    runGuardsAndResolvers: 'always'
  },
[...]

এবং তারপরে উপাদানটিতে:

  ngOnInit() {
    this.activatedRoute.paramMap.pipe(
      switchMap(
        (params: ParamMap) => {
          let id: string = params.get('id');
          if (id == "") {
            return of(undefined);
          }
          return this.usersService.getUser(Number(params.get('id')));
        }
      )
    ).subscribe(user => this.selectedUser = user);
  }

এই পথে:

  • ছাড়া রুটটি সেই পথেই /পুনঃনির্দেশিত হয়। কারণ pathMatch: 'full', কেবলমাত্র এই জাতীয় নির্দিষ্ট রুটই পুনঃনির্দেশিত হয়।

  • তারপরে, users/:idগৃহীত হয়। যদি আসল রুটটি ছিল users/, idতবে ""তাই এটি পরীক্ষা করে দেখুন ngOnInitএবং সেই অনুযায়ী কাজ করুন; অন্যথায়, idআইডি এবং এগিয়ে যান।

  • সংস্থাগুলির বাকী কাজগুলি অপরিজ্ঞাত selectedUserবা না হয় (* এনজিআইফ এবং এর মতো জিনিসগুলি)।

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