AngularJS: URL'deki sorgu parametrelerini nasıl temizleyebilirim?


135

AngularJS uygulamamın kullanıcının LinkedIn profiline erişmesi gerekiyor. Bunu yapmak için, kullanıcıyı LinkedIn'i web uygulamama yeniden yönlendirmesini ve URL'ye bir "kod" sorgu parametresi eklemesini söyleyecek bir geri arama redirect_uri parametresi içeren bir LinkedIn URL'sine yönlendirmem gerekiyor. Geleneksel bir Oauth 2.0 akışı.

LinkedIn'in kullanıcıyı aşağıdaki URL'ye yönlendirmesi dışında her şey harika çalışıyor:

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

?code=XXX&state=YYYTemiz hale getirmek için URL'den kaldırmak istiyorum . Kullanıcının LinkedIn yönlendirmesinden aldığım sorgu parametrelerini görmesi gerekmez.

Denedim $location.absUrl($location.path() + $location.hash()).replace(), ancak sorgu parametrelerini URL'de tutar.

Ben de kullanarak sorgu parametrelerini, örneğin "kod" ayıklayamıyorum ($location.search()).code. Görünüşe göre? yukarıdaki URL’deki # önce Angular kandırıyor.

Yanıtlar:


151

kullanırım

$location.search('key', null)

Bu sadece anahtarımı silmekle kalmaz, aynı zamanda URL'deki görünürlükten de kaldırır.


2
bu, geri düğmesindeki gibi kromda bir geri düğmesi döngüsüne neden olur //example.com?key=value, ancak //example.com'a açısal ileri gider. Öneriler?
jaybro

2
Bu bana kod sorunu gibi geliyor. Açısal, sizin tarafınızdan eklenen bir yöntem kralı olmadığı sürece hiçbir şey iletmemelidir. Ayrıca, .replace () eklenmesi geçerli geçmiş girdisinin yerine geçer.
Julius

viewModelHelper.navigateTo ( 'foo /'); foo url sorgu dizesi devam ediyordu, bu yüzden window.location.href = 'foo /' kullanarak sabit; yerine.
jaybro

2
Pencereyi kullanmayın, bunun yerine Angular'ın $ penceresini kullanın. Birim testi yapmak daha kolay olacaktır. Daha fazla: docs.angularjs.org/api/ng/service/$window
Julius

Belirli bir param silmek istiyorsanız bu anwers mükemmel çalışıyor, teşekkürler.
Dexxo

107

AngularJS forumundan cevap aldım. Ayrıntılar için bu konuya bakın


Bağlantı, okunması zor ve net bir cevap vermeyen bir Google Grupları konusudur. URL parametrelerini kaldırmak için şunu kullanın:

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

Ben yol $ location.path yerine $ location.url () koymak istedim düşünüyorum. İkisini de yukarıdaki gibi birleştirmeye çalışmak benim için işe yaramıyor.
mbdev

1
benim için de çalışmıyor. Her iki işlev de sorgu parametresini orada bırakır.
Pablo Ezequiel Leone

gerçekten yararlı bir cevap. Senaryomda, ilk kez $ location.path ('/ reportmaint'). Search ({<myparams>}) tetiklemesinden sonra, önceki sorgu parametrelerini asla temizlemedim.
bob.mazzo

bu, geri düğmesindeki gibi kromda bir geri düğmesi döngüsüne neden olur //example.com?key=value, ancak //example.com'a açısal ileri gider. Öneriler?
jaybro

+1 içinThe link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Vlad

70

TÜM sorgu parametrelerini kaldırmak için şunları yapın:

$location.search({});

Çıkarmak için ONE , özellikle sorgu parametresi yapın:

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

2
Açısal 1.5 için de çalışır.
Manish M Demblani

1
undefinedbenim nullgibi kullanmaktan kaçınmanız durumunda da çalışır .
HankScorpio

Ne sevmiyorum tarayıcı geri düğmesi ile geri giderseniz, önceki arama sayfamda daha önce yaptığım arama sorgusunu kaybedersiniz.
Gino

@Gino Geçici çözüm olarak, bu sıfırlamadan önce tarayıcı geçmişine bir kayıt ekleyebilirsiniz. stackoverflow.com/q/10541388/586051
Rahul Desai

@RahulDesai ng-route kullanıyorum, otomatik olarak yapacağım zor
Gino

29

Bir öğeyi silmek için öğeyi silin ve $$ compose öğesini arayın

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

angularjs kaynağından türetilmiştir: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443


2
parlak! Bir cazibe gibi çalıştı.
paulcpederson

Bu benim için işe yaradı, ancak Julius'un çözümünün daha doğru olduğunu varsayacağım, çünkü açısal adamların searchyöntemi oluştururken aklında olan şey gibi görünüyor . docs.angularjs.org/api/ng/service/$location#search
zmilojko

1
Teşekkürler, bu oldukça iyi çalıştı ... İlginçtir, IE8 bu URL'yi ayarlamayı / oluşturmayı ve daha sonra yüklemeyi sever. Eminim bu yüzden doğru yönlendirme tercih edilir ve neden hepimiz kötü insanlarız. : P
Romanulus

27

Belirli bir sorgu parametresini aşağıdakileri kullanarak silebilirsiniz:

delete $location.$$search.nameOfParameter;

Veya aramayı boş bir nesneye ayarlayarak tüm sorgu parametrelerini temizleyebilirsiniz:

$location.$$search = {};

2
Nedenini bilmiyorum, ancak bu çözüm sayfalar arasında geçiş yaparken iyi çalışmıyor (parametreler $location.$$search = {}yürütülmüş olsa bile yeniden görünebilir ). @basarat çözümü iyi çalışıyor.
Mik378

1
Benim için iyi çalıştı - belki parametreyi kaldırdığınız ve yolu değiştirdiğiniz sırayı kontrol edin?
demaniak

1
Bu işe yarasa da değiştirilmemesi gereken özel değişkenlere erişir, başka bir çözüm için @Julius cevabına bakın
Ben Taliadoros

26

Daha önce @Bosh tarafından belirtildiği gibi Yazım sırasında ve, html5modeolmalıdır truesetine edebilmek için $location.search()ve geri pencerenin görsel URL'ye yansıtılacaktır var.

Daha fazla bilgi için https://github.com/angular/angular.js/issues/1521 adresine bakın .

Ama eğer html5mode olduğunutrue kolayca ile URL sorgu dizesi temizleyebilirsiniz:

$location.search('');

veya

$location.search({});

Bu, pencerenin görsel URL'sini de değiştirir.

(Angularjs sürümde test 1.3.0-rc.1ile html5Mode(true)).


12

Ne zaman çalışması gerekir html5mode= false?

Diğer tüm cevaplar sadece Angular'ın html5modeolduğu zaman çalışır true. Dışında çalışıyorsanız html5mode, $locationyalnızca karma işleminizde yaşayan "sahte" konuma karşılık gelir ve bu nedenle $location.searchgerçek sayfanın arama parametrelerini göremez / düzenleyemez / düzeltemez.

Açısal yüklemelerden önce sayfanın HTML'sine eklenecek bir geçici çözüm şunlardır:

<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
Ben html5Mode doğru yapılandırmaktan kaçındı başka bir yolu, hemen önce # içeren sorgu dizesi oluşturarak ? . var myapp/#?client=clientName yerine myapp/?client=clientName
Melek Gao

5

Sadece kullan

$location.url();

Onun yerine

$location.path();

4

Başka bir URL'ye geçmek ve sorgu parametrelerini temizlemek istiyorsanız sadece şunu kullanın:

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

1

Route parametrelerini kullanıyorsanız $ routeParams'ı temizlemeniz yeterlidir

$routeParams= null;

1
Bu sadece yerel değişkeni $routeParamsolarak ayarlar null. Aslında adres çubuğundaki URL parametrelerini hiç etkilemez.
Eric F.

1

Konum karmasını null değerine ayarlamaya ne dersiniz?

$location.hash(null);

0

parametreleri hemen işlerseniz ve bir sonraki sayfaya geçerseniz, yeni konumun sonuna bir soru işareti koyabilirsiniz.

örneğin, $ location.path ('/ nextPage') yaparsanız;

bunun yerine şunları yapabilirsiniz: $ location.path ('/ nextPage?');


0

Yukarıdaki cevapları denedim ama çalıştıramadım. Benim için çalışan tek kod$window.location.search = ''


0

Tüm sorgu parametrelerini bu tek satırla değiştirebilirim: $location.search({});
Anlaşılması kolay ve bunları temizlemenin kolay yolu.


0

Kabul edilen cevap benim için çalıştı, ancak geri düğmesi ile ilgili sorunları çözmek için biraz daha derine inmem gerekiyordu.

Ne fark ettim kullanarak kullanarak bir sayfaya bağlantı <a ui-sref="page({x: 1})">, o zaman kullanarak sorgu dizesini kaldırmak, $location.search('x', null)benim tarayıcı geçmişinde fazladan bir girdi alamadım, bu yüzden geri düğmesi beni başladığım yere geri götürür. Bunun yanlış olduğunu düşünmeme rağmen, Angular'ın bu geçmiş girdisini benim için otomatik olarak kaldırması gerektiğini düşünmüyorum, bu aslında benim özel kullanım durumum için istenen davranış.

Sorun kullanarak sayfasına yönlendiren olmasıdır <a href="https://stackoverflow.com/page/?x=1">yerine, o zaman, aynı şekilde sorgu dizesi kaldırmak yapmak geri düğmesini zorunda, benim tarayıcı geçmişinde fazladan bir giriş olsun iki kez başladığım yere geri almak için . Bu tutarsız bir davranış, ama aslında bu daha doğru görünüyor.

hrefKullanarak bağlantıları ile sorunu kolayca düzeltebilirsiniz $location.search('x', null).replace(), ancak daha sonra bu bir ui-srefbağlantı üzerinden üzerine geldiğinizde sayfayı kırar , bu yüzden bu iyi değil.

Etrafta çok uğraştıktan sonra, bulduğum düzeltme:

Uygulamamın runfonksiyonunda bunu ekledim:

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

Sonra sorgu dizesi parametresini kaldırmak için bu kodu kullanın:

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

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

0

İçin açısal> 2 , Hepiniz için Temizlemek istediğiniz params null adlı geçebilir

this.router.navigate(['/yourRoute'], {queryParams:{params1: null, param2: null}})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.