جافاسكريبت - أنجولار إزالة معلمة الاستعلام


كيف يمكنني إزالة معلمة استعلام من عنوان URL؟ على سبيل المثال من www.expample.com/home?id=123&pos=sd&sd=iii إلى www.expample.com/home?id=123&sd=iii

تعديل: هذه هي نسختي:

this.activatedRoute.queryParams.subscribe(c => {
  const params = Object.assign({}, c);
  delete params.dapp;
  this.router.navigate([], { relativeTo: this.activatedRoute, queryParams: params });
}).unsubscribe();

الإجابة رقم 1

يمكنك إزالة معلمة استعلام باستخدام خيار merge من queryParamsHandling وتمرير null لأي معلمات ترغب في إزالتها.

// Remove query params
this.router.navigate([], {
  queryParams: {
    'yourParamName': null,
    'youCanRemoveMultiple': null,
  },
  queryParamsHandling: 'merge'
})

هذا الخيار أبسط ويتطلب عملاً أقل لضمان عدم إزالة معلمات أخرى. كما أنك لا تحتاج إلى القلق بشأن تنظيف الاشتراك المرئي عندما يتم تدمير المكون الخاص بك.

الإجابة رقم 2

تحديث: إجابة @epelc أدناه هي الطريقة المحدثة والصحيحة للقيام بذلك: https://stackoverflow.com/a/52193044/5932590.

لسوء الحظ، لا يوجد حالياً طريقة واضحة للقيام بذلك: https://github.com/angular/angular/issues/18011. ومع ذلك، كما علق jasonaden على الموضوع المرتبط،

يمكن القيام بذلك يدويًا عن طريق دمج معلمات الاستعلام القديمة والجديدة، وإزالة المفتاح الذي لا تريده.

إليك طريقة واحدة للقيام بذلك:

لنفترض أن لديك معلمات الاستعلام مخزنة في بعض الخصائص.

class MyComponent() {
  id: string;
  pos: string;
  sd: string;

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

  ngOnInit() {
    this.route.url.subscribe(next => {
      const paramMap = next.queryParamMap;
      this.id = paramMap.get('id');
      this.pos = paramMap.get('pos');
      this.sd = paramMap.get('sd');
    });
  }
}

طريقة لمسح المعامل pos ستبدو هكذا:

clearPosParam() {
  this.router.navigate(
    ['.'], 
    { relativeTo: this.route, queryParams: { id: this.id, sd: this.sd } }
  );
}

سيؤدي هذا فعليًا إلى الانتقال إلى المسار الحالي ومسح معامل الاستعلام pos الخاص بك، مع الحفاظ على باقي معلمات الاستعلام كما هي.