AngularJS: วิธีล้างพารามิเตอร์การสืบค้นใน URL


135

แอปพลิเคชัน My AngularJS จำเป็นต้องเข้าถึงโปรไฟล์ LinkedIn ของผู้ใช้ ในการทำเช่นนั้นฉันจำเป็นต้องเปลี่ยนเส้นทางผู้ใช้ไปยัง LinkedIn URL ซึ่งมีพารามิเตอร์ callback redirect_uri ซึ่งจะบอก LinkedIn ให้เปลี่ยนเส้นทางผู้ใช้กลับไปที่ webapp ของฉันและรวมพารามิเตอร์การสืบค้น "code" ไว้ใน URL มันเป็นโฟลว์ Oauth 2.0 แบบดั้งเดิม

ทุกอย่างใช้งานได้ดียกเว้นว่า LinkedIn เปลี่ยนเส้นทางผู้ใช้กลับไปที่ URL ต่อไปนี้:

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

ฉันต้องการลบออก?code=XXX&state=YYYจาก URL เพื่อให้สะอาด ผู้ใช้ไม่จำเป็นต้องเห็นพารามิเตอร์ข้อความค้นหาที่ฉันได้รับจากการเปลี่ยนเส้นทาง LinkedIn

ฉันพยายาม$location.absUrl($location.path() + $location.hash()).replace()แต่มันเก็บ params แบบสอบถามไว้ใน URL

นอกจากนี้ผมยังไม่สามารถที่จะดึงพารามิเตอร์การค้นหาเช่น "รหัส" ($location.search()).codeโดยใช้ ดูเหมือนว่าจะมี? ก่อนหน้า # ใน URL ข้างต้นกำลังหลอกล่อเชิงมุม

คำตอบ:


151

ฉันใช้

$location.search('key', null)

เช่นนี้ไม่เพียง แต่ลบคีย์ของฉัน แต่ลบออกจากการแสดงผลบน URL


2
สิ่งนี้ทำให้เกิดห่วงปุ่มย้อนกลับในโครเมี่ยมในขณะที่ปุ่มย้อนกลับไปที่ //example.com?key=value แต่ส่งต่อเชิงมุมไปที่ //example.com ข้อเสนอแนะ?
jaybro

2
มันฟังดูคล้ายรหัสปัญหาสำหรับฉัน เชิงมุมไม่ควรส่งต่อสิ่งใดนอกจากคุณจะได้วิธีการเพิ่มเข้ามา รวมถึงการเพิ่ม. แทนที่ () แทนที่รายการประวัติปัจจุบัน
Julius

viewModelHelper.navigateTo ( 'foo /'); ยังคงสตริงข้อความค้นหาไว้ที่ foo url ดังนั้นฉันจึงแก้ไขโดยใช้ window.location.href = 'foo /'; แทน.
jaybro

2
อย่าใช้หน้าต่างใช้หน้าต่าง $ ของแองกูลาร์แทน การทดสอบหน่วยจะง่ายกว่า เพิ่มเติม: docs.angularjs.org/api/ng/service/$window
Julius

คำตอบนี้ใช้ได้ดีถ้าคุณต้องการลบพารามิเตอร์เฉพาะขอบคุณ
Dexxo

107

ฉันได้รับคำตอบจากฟอรัม AngularJS ดูกระทู้นี้สำหรับรายละเอียด


ลิงค์ไปยังเธรด Google Groups ซึ่งอ่านยากและไม่มีคำตอบที่ชัดเจน ในการลบพารามิเตอร์ URL ให้ใช้

$location.url($location.path());

ฉันคิดว่าคุณตั้งใจจะใส่เส้นทางใน $ location.url () แทนที่จะเป็น $ location.path การพยายามรวมทั้งสองอย่างจากด้านบนไม่ได้ผลสำหรับฉัน
mbdev

1
ไม่ได้ผลสำหรับฉันด้วย ฟังก์ชั่นทั้งสองออกจากแบบสอบถามพารามิเตอร์ที่นั่น
Pablo Ezequiel Leone

คำตอบที่เป็นประโยชน์แน่นอน ในสถานการณ์ของฉันทุกครั้งหลังจากที่ฉันเรียกทริกเกอร์ $ location.path ('/ reportmaint') การค้นหา ({<myparams>}) มันไม่เคยกำจัดพารามิเตอร์การค้นหาก่อนหน้า
bob.mazzo

สิ่งนี้ทำให้เกิดห่วงปุ่มย้อนกลับในโครเมี่ยมในขณะที่ปุ่มย้อนกลับไปที่ //example.com?key=value แต่ส่งต่อเชิงมุมไปที่ //example.com ข้อเสนอแนะ?
jaybro

+1 สำหรับThe link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Vlad

70

หากต้องการลบพารามิเตอร์ข้อความค้นหาทั้งหมดให้ทำ:

$location.search({});

ในการลบONEพารามิเตอร์การค้นหาโดยเฉพาะอย่างยิ่งต้องทำ:

$location.search('myQueryParam', null);

2
ใช้งานได้กับ Angular 1.5 เช่นกัน
Manish M Demblani

1
ใช้ได้กับundefinedกรณีที่คุณหลีกเลี่ยงการใช้nullเหมือนฉัน
HankScorpio

สิ่งที่ฉันไม่ชอบคือถ้าคุณกลับไปที่ปุ่มย้อนกลับของเบราว์เซอร์คุณหลวมคำค้นหาที่ฉันไม่เคยทำมาก่อนในหน้าการค้นหาก่อนหน้าของฉัน
Gino

@Gino เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถเพิ่มบันทึกลงในประวัติเบราว์เซอร์ก่อนการรีเซ็ตนี้ stackoverflow.com/q/10541388/586051
Rahul Desai

@RahulDesai ฉันใช้ ng-route ฉันแกร่งจะทำมันโดยอัตโนมัติ
Gino

29

หากต้องการล้างรายการให้ลบออกและเรียกการเขียน $$

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

ได้มาจาก angularjs แหล่งที่มา: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443


2
! สดใส ทำงานเหมือนจับใจ
paulcpederson

สิ่งนี้ใช้งานได้สำหรับฉัน แต่ฉันคิดว่าโซลูชันของ Julius นั้นถูกต้องมากขึ้นดูเหมือนว่าจะเป็นสิ่งที่คน Angular มีอยู่ในใจเมื่อพวกเขาสร้างsearchวิธีการ docs.angularjs.org/api/ng/service/$location#search
zmilojko

1
ขอบคุณมันใช้งานได้ดี ... น่าสนใจ IE8 ชอบตั้ง / เขียน URL นั้นแล้วโหลดในภายหลัง ฉันแน่ใจว่านี่เป็นเหตุผลว่าทำไมจึงเลือกการกำหนดเส้นทางที่เหมาะสมและทำไมเราทุกคนเป็นคนไม่ดี : P
Romanulus

27

คุณสามารถลบพารามิเตอร์การสืบค้นเฉพาะโดยใช้:

delete $location.$$search.nameOfParameter;

หรือคุณสามารถล้างพารามิเตอร์การค้นหาทั้งหมดได้โดยตั้งค่าการค้นหาเป็นวัตถุว่าง:

$location.$$search = {};

2
ฉันไม่รู้ว่าทำไม แต่โซลูชันนี้ใช้งานไม่ได้ในขณะที่สลับหน้า (พารามิเตอร์สามารถปรากฏขึ้นอีกครั้งแม้ว่า$location.$$search = {}จะถูกเรียกใช้) @basarat แก้ปัญหาทำงานได้ดี
Mik378

1
ทำงานได้ดีสำหรับฉัน - อาจตรวจสอบลำดับที่คุณลบพารามิเตอร์และเปลี่ยนเส้นทาง?
demaniak

1
แม้ว่าสิ่งนี้อาจใช้งานได้ แต่เข้าถึงตัวแปรส่วนตัวที่ไม่ควรแก้ไขโปรดดู @Julius คำตอบสำหรับวิธีแก้ไขปัญหาอื่น ๆ
Ben Taliadoros

26

ในขณะที่เขียนและตามที่ระบุไว้ก่อนหน้าโดย @Bosh html5modeจะต้องtrueสามารถตั้งค่า$location.search()และแสดงกลับเข้าไปใน URL ภาพของหน้าต่างได้

ดูhttps://github.com/angular/angular.js/issues/1521สำหรับข้อมูลเพิ่มเติม

แต่ถ้า html5mode เป็นtrueคุณสามารถล้างสตริงการสืบค้นของ URL ด้วย:

$location.search('');

หรือ

$location.search({});

นี่จะเป็นการเปลี่ยน URL ที่มองเห็นของหน้าต่างด้วย

(ทดสอบในรุ่น AngularJS 1.3.0-rc.1ด้วยhtml5Mode(true))


12

จำเป็นต้องทำให้มันทำงานเมื่อhtml5mode= false?

คำตอบอื่น ๆ ทั้งหมดใช้ได้เฉพาะเมื่อ Angular's html5modeเป็นtrueเท่านั้น หากคุณทำงานนอกสถานที่html5modeให้$locationอ้างอิงเฉพาะตำแหน่ง "ปลอม" ที่อาศัยอยู่ในแฮชของคุณ - ดังนั้นจึง$location.searchไม่สามารถดู / แก้ไข / แก้ไขพารามิเตอร์การค้นหาของหน้าจริง

นี่เป็นวิธีแก้ปัญหาที่จะแทรกใน HTML ของหน้าก่อนที่จะโหลดเชิงมุม:

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>

2
อีกวิธีที่ฉันหลีกเลี่ยงการกำหนดค่า html5Mode เป็นจริงก็คือการสร้างสตริงข้อความค้นหาที่มี# อยู่ตรงหน้า? . มี myapp/#?client=clientName แทน myapp/?client=clientName
Angel Gao


4

หากคุณต้องการย้ายไปยัง URL อื่นและล้างพารามิเตอร์การสืบค้นให้ใช้:

$location.path('/my/path').search({});

1

หากคุณกำลังใช้พารามิเตอร์เส้นทางเพียงแค่ล้าง $ routeParams

$routeParams= null;

1
เพียงแค่นี้ก็จะตั้งค่าตัวแปรท้องถิ่นเพื่อ$routeParams nullจะไม่ส่งผลกระทบต่อพารามิเตอร์ URL ในแถบที่อยู่ แต่อย่างใด
Eric F.


0

หากคุณประมวลผลพารามิเตอร์ทันทีจากนั้นย้ายไปที่หน้าถัดไปคุณสามารถใส่เครื่องหมายคำถามที่ส่วนท้ายของตำแหน่งใหม่

ตัวอย่างเช่นหากคุณทำ $ location.path ('/ nextPage');

คุณสามารถทำได้แทน: $ location.path ('/ nextPage?');


0

ฉันได้ลองคำตอบข้างต้นแล้ว แต่ไม่สามารถทำงานได้ รหัสเดียวที่ทำงานสำหรับฉันคือ$window.location.search = ''


0

ฉันสามารถแทนที่พารามิเตอร์การค้นหาทั้งหมดด้วยบรรทัดเดียวนี้: $location.search({});
เข้าใจง่ายและวิธีง่าย ๆ ในการล้างค่าออก


0

คำตอบที่ยอมรับนั้นใช้ได้สำหรับฉัน แต่ฉันต้องขุดให้ลึกลงไปอีกเล็กน้อยเพื่อแก้ไขปัญหาด้วยปุ่มย้อนกลับ

สิ่งที่ฉันสังเกตเห็นคือถ้าฉันเชื่อมโยงไปยังหน้าที่ใช้<a ui-sref="page({x: 1})">แล้วลบสตริงการสืบค้นโดยใช้$location.search('x', null)ฉันไม่ได้รับรายการพิเศษในประวัติเบราว์เซอร์ของฉันดังนั้นปุ่มย้อนกลับจะนำฉันกลับไปที่ที่ฉันเริ่ม แม้ว่าฉันจะรู้สึกว่ามันผิดเพราะฉันไม่คิดว่า Angular ควรลบรายการประวัตินี้โดยอัตโนมัติสำหรับฉันนี่เป็นพฤติกรรมที่ต้องการสำหรับกรณีการใช้งานของฉันโดยเฉพาะ

ปัญหาคือถ้าฉันเชื่อมโยงไปยังหน้าที่ใช้<a href="https://stackoverflow.com/page/?x=1">แทนแล้วลบสตริงการสืบค้นในลักษณะเดียวกันฉันจะได้รับรายการพิเศษในประวัติเบราว์เซอร์ของฉันดังนั้นฉันต้องคลิกปุ่มย้อนกลับสองครั้งเพื่อกลับไปที่ที่ฉันเริ่ม . นี่เป็นพฤติกรรมที่ไม่สอดคล้องกัน แต่จริงๆแล้วนี่ดูเหมือนจะถูกต้องมากขึ้น

ฉันสามารถแก้ไขปัญหาด้วยการhrefเชื่อมโยงโดยใช้$location.search('x', null).replace()แต่แล้วนี่จะแบ่งหน้าเมื่อคุณui-srefเชื่อมโยงไปถึงผ่านลิงก์ดังนั้นจึงไม่ดี

หลังจากเล่นซอไปรอบ ๆ นี่คือการแก้ไขที่ฉันได้รับ:

ในrunฟังก์ชั่นแอปของฉันฉันเพิ่มสิ่งนี้:

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

จากนั้นฉันใช้รหัสนี้เพื่อลบพารามิเตอร์สตริงการสืบค้น:

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}

0

สำหรับเชิงมุม> 2คุณสามารถส่งค่าว่างไปยังพารามิเตอร์ทั้งหมดที่คุณต้องการลบ

this.router.navigate(['/yourRoute'], {queryParams:{params1: null, param2: null}})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.