Saya ingin membaca nilai parameter kueri URL menggunakan AngularJS. Saya mengakses HTML dengan URL berikut:
http://127.0.0.1:8080/test.html?target=bob
Seperti yang diharapkan, location.search
adalah "?target=bob"
. Untuk mengakses nilai target , saya telah menemukan berbagai contoh yang terdaftar di web, tetapi tidak ada yang bekerja di AngularJS 1.0.0rc10. Secara khusus, berikut ini semuanya undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Adakah yang tahu apa yang akan berhasil? (Saya menggunakan $location
sebagai parameter ke controller saya)
Memperbarui:
Saya telah memposting solusi di bawah ini, tetapi saya tidak sepenuhnya puas dengannya. Dokumentasi di Panduan Pengembang: Layanan Angular: Menggunakan $ location menyatakan yang berikut tentang $location
:
Kapan saya harus menggunakan $ location?
Kapan saja aplikasi Anda perlu bereaksi terhadap perubahan pada URL saat ini atau jika Anda ingin mengubah URL saat ini di browser.
Untuk skenario saya, halaman saya akan dibuka dari halaman web eksternal dengan parameter kueri, jadi saya tidak "bereaksi terhadap perubahan dalam URL saat ini" per se. Jadi mungkin $location
bukan alat yang tepat untuk pekerjaan itu (untuk detail yang jelek, lihat jawaban saya di bawah). Karena itu saya mengubah judul pertanyaan ini dari "Bagaimana cara membaca parameter kueri di AngularJS menggunakan $ location?" to "Apa cara paling ringkas untuk membaca parameter kueri di AngularJS?". Jelas saya hanya bisa menggunakan javascript dan ekspresi reguler untuk mem-parsing location.search
, tetapi pergi ke tingkat rendah untuk sesuatu yang sangat mendasar benar-benar menyinggung perasaan programmer saya.
Jadi: apakah ada cara yang lebih baik untuk digunakan $location
daripada jawaban saya, atau adakah alternatif yang ringkas?
http://127.0.0.1:8080/test.html#?target=bob
akan bekerja, perhatikan#
sebelum?
.$location
adalah metode perutean tingkat kedua yang tidak dapat dikirim ke server.$location.search()['target']
berfungsi setelah$locationProvider.html5Mode(true)
dipanggil di browser modern.Jawaban:
Anda dapat menyuntikkan $ routeParams (membutuhkan ngRoute ) ke controller Anda. Berikut ini contoh dari dokumen:
EDIT: Anda juga bisa mendapatkan dan mengatur parameter kueri dengan layanan $ location (tersedia di
ng
), khususnyasearch
metodenya: $ location.search () .$ routeParams kurang berguna setelah beban awal controller;
$location.search()
bisa dipanggil kapan saja.sumber
Bagus bahwa Anda berhasil membuatnya bekerja dengan mode html5 tetapi juga memungkinkan untuk membuatnya bekerja dalam mode hashbang.
Anda cukup menggunakan:
untuk mendapatkan akses ke param pencarian 'target'.
Untuk referensi, inilah jsFiddle yang berfungsi: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
sumber
HTML5Mode(true)
maka hanya params setelah # / tersedia atau ditambahkan ke url dengan # / di awal.$location.search()
. Saya tidak yakin mengapa jawaban ini menempatkan mereka di sana.$location.search()
.Untuk memberikan sebagian jawaban pertanyaan saya sendiri, berikut adalah contoh yang berfungsi untuk browser HTML5:
Kuncinya adalah menelepon
$locationProvider.html5Mode(true);
seperti yang dilakukan di atas. Sekarang berfungsi saat membukahttp://127.0.0.1:8080/test.html?target=bob
. Saya tidak senang dengan kenyataan bahwa itu tidak akan berfungsi di browser lama, tetapi saya mungkin akan menggunakan pendekatan ini.Alternatif yang akan bekerja dengan browser lama adalah dengan
html5mode(true)
menelpon dan menggunakan alamat berikut dengan hash + slash sebagai gantinya:http://127.0.0.1:8080/test.html#/?target=bob
Dokumentasi yang relevan ada di Panduan Pengembang: Layanan Angular: Menggunakan $ location (aneh bahwa pencarian google saya tidak menemukan ini ...).
sumber
ng-controller
atribut<body>
diatur keMyApp
?<base href="https://stackoverflow.com/" />
tag, atau menambahkanrequireBase: false
parameter lain ke panggilan ke html5Mode. Detail di siniItu bisa dilakukan dengan dua cara:
$routeParams
Solusi terbaik dan yang disarankan adalah untuk digunakan
$routeParams
ke controller Anda. MembutuhkanngRoute
modul untuk diinstal.$location.search()
.Ada peringatan di sini. Ini hanya akan bekerja dengan mode HTML5. Secara default, ini tidak berfungsi untuk URL yang tidak memiliki hash (
#
) di dalamnyahttp://localhost/test?param1=abc¶m2=def
Anda dapat membuatnya berfungsi dengan menambahkan
#/
URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
untuk mengembalikan objek seperti:sumber
$ location.search () akan bekerja hanya dengan mode HTML5 dihidupkan dan hanya pada browser yang mendukung.
Ini akan selalu berhasil:
$ window.location.search
sumber
Hanya untuk musim panas.
Jika aplikasi Anda sedang dimuat dari tautan eksternal maka sudut tidak akan mendeteksi ini sebagai perubahan URL sehingga $ loaction.search () akan memberi Anda objek kosong. Untuk mengatasi ini, Anda perlu mengatur yang berikut di konfigurasi aplikasi Anda (app.js)
sumber
Hanya presisi untuk jawaban Ellis Whitehead.
$locationProvider.html5Mode(true);
tidak akan bekerja dengan versi baru dari angularjs tanpa menentukan URL dasar untuk aplikasi dengan<base href="">
tag atau pengaturan parameterrequireBase
untukfalse
Dari dokumen :
sumber
Anda juga bisa menggunakan $ location. $$ search.yourparameter
sumber
$$search
adalah variabel internal, penggunaannya bukan ide yang bagus.ini dapat membantu kamu
Apa cara paling ringkas untuk membaca parameter kueri di AngularJS
sumber
Saya menemukan bahwa untuk SPA HTML5Mode menyebabkan banyak 404 masalah kesalahan, dan tidak perlu membuat $ location.search berfungsi dalam kasus ini. Dalam kasus saya, saya ingin menangkap parameter string kueri URL ketika pengguna datang ke situs saya, terlepas dari "halaman" mana yang awalnya mereka tautkan, DAN dapat mengirimkannya ke halaman tersebut setelah mereka masuk. Jadi saya hanya menangkap semua barang-barang itu di app.run
kemudian nanti setelah login saya bisa mengatakan $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
sumber
Ini agak terlambat, tapi saya pikir masalah Anda adalah URL Anda. Jika bukan
kamu punya
Saya cukup yakin itu akan berhasil. Angular benar-benar pilih-pilih tentang # /
sumber