AngularJS $ location kullanarak bir url'deki sorgu dizesinden değerler alma


95

$ Location.search ile ilgili olarak dokümanlar ,

Herhangi bir parametre olmadan çağrıldığında mevcut url'nin arama kısmını (nesne olarak) döndür.

Url'mde, sorgu dizemde değer içermeyen bir '? Test_user_bLzgB' parametresi var. Ayrıca '$ location.search ()' bir nesne döndürür. Asıl metni nasıl alırım?


Hangi Nesneyi alıyorsun? Karşılaştığınız sorunu gösteren bir keman veya keman var mı? Eğer kullandığınızda doğru $location.search()... ama diyoruz aldığınız o "nesne" kontrol etmek isteyen
callmekatootie

Ne nesne olduğunu bilmiyorum. Özellikleri sıralamayı denedim ama hiç görünmüyor.
Ian Warburton

Bir sorgu dizesini inceleyen bir keman nasıl yapılır bilmiyorum.
Ian Warburton

Yanıtlar:


152

Kabul edilen yanıt kabul edildiğinden beri değişip değişmediğinden emin değilim, ancak bu mümkündür.

$location.search()sorgu dizesiyle aynı anahtar-değer çiftlerinden oluşan bir nesne döndürür. Değeri olmayan bir anahtar sadece nesnede doğru olarak saklanır. Bu durumda, nesne şöyle olacaktır:

{"test_user_bLzgB": true}

Bu değere doğrudan şununla erişebilirsiniz: $location.search().test_user_bLzgB

Örnek (daha büyük sorgu dizesiyle): http://fiddle.jshell.net/TheSharpieOne/yHv2p/4/show/?test_user_bLzgB&somethingElse&also&something=Somethingelse

Not: Karmalar nedeniyle ( yeni bir keman oluşturacak şekilde http://fiddle.jshell.net/#/url adresine gideceği için ), bu keman, js geçmişini desteklemeyen tarayıcılarda çalışmayacaktır (çalışmayacaktır). IE'de <10)

Düzenleme:
@Naresh ve @DavidTchepak'ın yorumlarında belirtildiği gibi, $locationProviderayrıca doğru şekilde yapılandırılması gerekir: https://code.angularjs.org/1.2.23/docs/guide/$location#-location-service-configuration


3
Naresh'in bahsettiği gibi, $locationProviderdoğru şekilde yapılandırılması da gerekiyor: code.angularjs.org/1.2.23/docs/guide/… (Bu beni heyecanlandırdı . Umarım bağlantı diğerlerine biraz zaman kazandırır.)
David Tchepak

2
Konum sağlayıcısını yapılandırmak için şunlara ihtiyacınız vardır: window.app.config ['$ locationProvider', ($ locationProvider) -> $ locationProvider.html5Mode true] Ayrıca HTML dosyasında bir temel etikete ihtiyacınız vardır: <base href = "/">
Amin Ariana

İlham ve faydalı ipuçları için teşekkürler, sadece durumumu paylaşın. UserConfig adında bir sabit oluşturuyorum ve her şeyi içine koyuyorum, bazı ayarlar kullanıcı esnekliği için sorgu dizesi ile geçersiz kılınabilir. Bunu kullanıyorum ve sorguyu HTML etiketindeki bir globalController kapsam değişkenine koyuyorum, böylece herhangi bir alt denetleyici servis dahil parametreyi alabilir. Çünkü userConfig, Hizmete de yerleştirilmiştir. Böylece sanal olarak birlikte etkileşime girebilirler.
simongcc

Bir js işlevini kullanmayı daha kolay buldum, $ location.search () birçok hareketli parçaya sahip. Sorgu dizesi parametrelerini almak için birçok kod örneği vardır.
nuander

@TheSharpieOne Bir dakikanız varsa bu soruya bir göz atabilir misiniz? stackoverflow.com/questions/43121888/…
Leon Gaban

48

Yalnızca sorgu dizesine metin olarak bakmanız gerekiyorsa, şunları kullanabilirsiniz: $window.location.search


11
Bu nasıl bir cevap değil? Belki biraz kısa, ama yok soruya cevap gibi görünüyor.
Léo Lam

Zaman damgalarını kontrol ederseniz, cevap Dan'in yorumundan 2 saat sonra düzenlenmiştir. Gerçekten o kadar önemli değil, ama Leo'nun yorumunun olumlu oylarla karşılanması şok edici buldum, bu yüzden bunu belirteyim dedim.
Bill Tarbell

40

$location.search()değişkenler olarak anahtarlardan ve onun değeri olarak değerlerden oluşan bir nesne döndürür. Öyleyse: sorgu dizenizi şöyle yazarsanız:

?user=test_user_bLzgB

Metni şöyle kolayca alabilirsiniz:

$location.search().user

? Foo = bar gibi bir anahtar kullanmak istemiyorsanız, #test_user_bLzgB hash kullanmanızı öneririm,

ve arıyor

$location.hash()

geri almak istediğiniz veri olan 'test_user_bLzgB'yi döndürecektir.

İlave bilgi:

Sorgu dizesi yöntemini kullandıysanız ve $ location.search () ile boş bir nesne alıyorsanız, bunun nedeni muhtemelen Angular'ın html5 yerine hashbang stratejisini kullanmasıdır ... Çalışmasını sağlamak için, bu yapılandırmayı modül

yourModule.config(['$locationProvider', function($locationProvider){
    $locationProvider.html5Mode(true);    
}]);

13

Öncelikle sorgu dizesini almak için URL biçimini doğru yapın , benim için çalışan #? Q = dizesini kullanın

http://localhost/codeschool/index.php#?foo=abcd

$ Location hizmetini denetleyiciye enjekte edin

app.controller('MyController', [ '$location', function($location) { 

    var searchObject = $location.search();

    // $location.search(); reutrn object 
    // searchObject = { foo = 'abcd' };

    alert( searchObject.foo );

} ]);

Yani çıktı abcd olmalı


10

bunu da kullanabilirsin

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

var queryValue = getParameterByName('test_user_bLzgB');

3
Bu işlevi başka bir SOF yanıtından kopyaladınız ... en iyisi kaynağınıza başvurmaktır.
arcseldon

Evet, kullandığım şey bu,
SO'da bir

10

Çalışmıyorsanız $location.search(), aşağıdakilere sahip olduğunuzdan emin olun:

1) html5Mode(true)uygulamanın modül yapılandırmasında yapılandırılır

appModule.config(['$locationProvider', function($locationProvider) {
   $locationProvider.html5Mode(true);
}]);

2) <base href="https://stackoverflow.com/">HTML'nizde mevcut

<head>
  <base href="/">
  ...
</head>

Referanslar:

  1. base href = "/"
  2. html5Mode

"html5Mode (true), uygulamanın modül yapılandırmasında yapılandırıldı" - açıkla
15ee8f99-57ff-4f92-890c-b56153

@EdPlunkett - Üzgünüm, açısal bir uygulama nesnesinin yapılandırma yönteminde yapılandırıldığını söylemek istedim. Örneğin burada: var appModule = angular.module ('myAppModule', []);
Mahesh

Teşekkürler,
Angular'da

Evet, bu çok önemli, aynı sorunla karşılaştık
Bahadır Taşdemir

7

Angular, bu tür bir sorgu dizesini desteklemez.

URL'nin sorgu kısmının, &anahtar-değer çiftlerinin ayrılmış bir dizisi olması ve dolayısıyla bir nesne olarak mükemmel şekilde yorumlanabilmesi gerekir.

Anahtar / değer çifti kümelerini temsil etmeyen sorgu dizelerini yönetmek için hiçbir API yoktur.


0

NodeJS örneğimde, geçiş yapmak ve değerleri elde etmek istediğim bir "localhost: 8080 / Lists / list1.html? X1 = y" url'im var.

$ Location.search () ile çalışarak x1 = y elde etmek için birkaç şey yaptım

  1. angular-route.js için komut dosyası kaynağı
  2. Uygulama modülünüzün bağımlılıklarına "ngRoute" ekleyin
  3. Konumunuzu yapılandırın
  4. $ Location için temel etiketi ekleyin (yapmazsanız, search (). X1 hiçbir şey döndürmez veya tanımsız döndürür. Veya temel etiket yanlış bilgiye sahipse, tarayıcınız dosyalarınızı src komut dosyası içinde bulamaz .html gereksinimleriniz. Dosya konumlarınızı test etmek için her zaman sayfanın görünüm kaynağını açın!)
  5. konum hizmetini çağır (search ())

list1.js'de

    var app = angular.module('NGApp', ['ngRoute']);  //dependencies : ngRoute
    app.config(function ($locationProvider) { //config your locationProvider
         $locationProvider.html5Mode(true).hashPrefix('');
    });

    app.controller('NGCtrl', function ($scope, datasvc, $location) {// inject your location service
        //var val = window.location.href.toString().split('=')[1];
        var val = $location.search().x1;    alert(val);
        $scope.xout = function () {
           datasvc.out(val)
           .then(function (data) {
              $scope.x1 = val;
              $scope.allMyStuffs = data.all;
           });
        };
        $scope.xout();
    });

ve benim list1.html’im

<head>
    <base href=".">
    </head>
<body ng-controller="NGCtrl">
<div>A<input ng-model="x1"/><br/><textarea ng-model="allMyStuffs"/></div>
<script src="../js/jquery-2.1.4.min.js"></script>
<script src="../js/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-route.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/ui-bootstrap-tpls-0.14.3.min.js"></script>
<script src="list1.js"></script>
</body>

Kılavuz: https://code.angularjs.org/1.2.23/docs/guide/$location


0

Düzeltmem daha basit, bir fabrika oluşturun ve tek bir değişken olarak uygulayın. Örneğin

angular.module('myApp', [])

// This a searchCustom factory. Copy the factory and implement in the controller
.factory("searchCustom", function($http,$log){    
    return {
        valuesParams : function(params){
            paramsResult = [];
            params = params.replace('(', '').replace(')','').split("&");
            
            for(x in params){
                paramsKeyTmp = params[x].split("=");
                
                // Si el parametro esta disponible anexamos al vector paramResult
                if (paramsKeyTmp[1] !== '' && paramsKeyTmp[1] !== ' ' && 
                    paramsKeyTmp[1] !== null){          
                    
                    paramsResult.push(params[x]);
                }
            }
            
            return paramsResult;
        }
    }
})

.controller("SearchController", function($scope, $http,$routeParams,$log,searchCustom){
    $ctrl = this;
    
    var valueParams = searchCustom.valuesParams($routeParams.value);
    valueParams = valueParams.join('&');

    $http({
        method : "GET",
        url: webservice+"q?"+valueParams
    }).then( function successCallback(response){
        data = response.data;
        $scope.cantEncontrados = data.length; 
        $scope.dataSearch = data;
        
    } , function errorCallback(response){
        console.log(response.statusText);
    })
      
})
<html>
<head>
</head>
<body ng-app="myApp">
<div ng-controller="SearchController">
<form action="#" >
                          
                            
                            <input ng-model="param1" 
                                   placeholder="param1" />
                            
                            <input  ng-model="param2" 
                                    placeholder="param2"/>
                        
<!-- Implement in the html code 
(param1={{param1}}&param2={{param2}}) -> this is a one variable, the factory searchCustom split and restructure in the array params
-->          
                        <a href="#seach/(param1={{param1}}&param2={{param2}})">
                            <buttom ng-click="searchData()" >Busqueda</buttom>
                        </a>
                    </form> 
</div>
</body>

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.