Saya memiliki pengontrol yang bertanggung jawab untuk berkomunikasi dengan API untuk memperbarui properti pengguna, nama, email, dll. Setiap pengguna memiliki 'id'
yang dilewatkan dari server ketika halaman profil dilihat.
Saya ingin meneruskan nilai ini ke pengontrol AngularJS sehingga ia tahu apa titik masuk API untuk pengguna saat ini. Saya sudah mencoba meneruskan nilai ng-controller
. Sebagai contoh:
function UserCtrl(id, $scope, $filter) {
$scope.connection = $resource('api.com/user/' + id)
dan dalam HTML
<body ng-controller="UserCtrl({% id %})">
di mana {% id %}
mencetak id yang dikirim dari server. tapi saya mendapatkan kesalahan.
Apa cara yang benar untuk meneruskan nilai ke controller pada pembuatannya?
javascript
angularjs
nickponline
sumber
sumber
Jawaban:
Catatan:
Jawaban ini sudah tua. Ini hanyalah bukti konsep tentang bagaimana hasil yang diinginkan dapat dicapai. Namun, itu mungkin bukan solusi terbaik sesuai beberapa komentar di bawah ini. Saya tidak memiliki dokumentasi untuk mendukung atau menolak pendekatan berikut. Silakan merujuk ke beberapa komentar di bawah ini untuk diskusi lebih lanjut tentang topik ini.
Jawaban asli:
Saya menjawab ini untuk Ya Anda benar-benar dapat melakukannya menggunakan
ng-init
dan fungsi init sederhana.Berikut ini contohnya pada plunker
HTML
JavaScript
sumber
The only appropriate use of ngInit for aliasing special properties of ngRepeat, as seen in the demo below. Besides this case, you should use controllers rather than ngInit to initialize values on a scope.
ng-init
terjadi - lihat plnkr.co/edit / donCm6FRBSX9oENXh9WJ? p = previewSaya sangat terlambat untuk hal ini dan saya tidak tahu apakah ini ide yang bagus, tetapi Anda dapat memasukkan
$attrs
injeksi ke dalam fungsi pengontrol yang memungkinkan pengontrol diinisialisasi menggunakan "argumen" yang disediakan pada suatu elemen, misalnyaSekali lagi, tidak tahu apakah ini ide yang bagus, tetapi tampaknya berhasil dan merupakan alternatif lain.
sumber
ng-init
- jika Anda mencoba untuk mengikat ke nilai lingkup, itu sudah menjalankan fungsi controller sebelumng-init
terjadi - lihat plnkr.co/edit/donCm6FRBSX9oENXh9WJ?p=previewIni juga berfungsi.
Javascript:
Html:
sumber
Tampilan tidak boleh menentukan konfigurasi
Di Angular, templat tidak boleh mendikte konfigurasi, yang secara inheren diinginkan orang ketika mereka ingin memberikan argumen kepada pengontrol dari file templat. Ini menjadi lereng yang licin. Jika pengaturan konfigurasi dikodekan dalam templat (seperti oleh atribut argumen direktif atau pengontrol), Anda tidak bisa lagi menggunakan kembali templat itu untuk apa pun kecuali penggunaan tunggal itu. Sebentar lagi Anda akan ingin menggunakan kembali templat itu, tetapi dengan konfigurasi yang berbeda dan sekarang untuk melakukannya Anda akan melakukan pra-pemrosesan templat untuk menyuntikkan variabel sebelum diteruskan ke sudut atau menggunakan arahan masif untuk mengeluarkan raksasa blok HTML sehingga Anda menggunakan kembali semua HTML controller kecuali untuk div pembungkus dan argumennya. Untuk proyek kecil itu bukan masalah besar. Untuk sesuatu yang besar (keunggulan sudut), ia menjadi cepat jelek.
Alternatif: Modul
Jenis konfigurasi inilah yang dirancang untuk ditangani oleh modul. Dalam banyak tutorial sudut orang memiliki modul tunggal untuk seluruh aplikasi mereka, tetapi sistem ini dirancang dan sepenuhnya mendukung banyak modul kecil yang masing-masing membungkus potongan-potongan kecil dari total aplikasi. Idealnya, pengontrol, modul, dll akan dideklarasikan dalam file terpisah dan dijahit bersama dalam potongan yang dapat digunakan kembali secara spesifik. Ketika aplikasi Anda dirancang dengan cara ini, Anda mendapatkan banyak penggunaan kembali selain argumen pengontrol yang mudah.
Contoh di bawah ini memiliki 2 modul, menggunakan kembali kontroler yang sama, tetapi masing-masing dengan pengaturan konfigurasi sendiri. Pengaturan konfigurasi dilewatkan melalui ketergantungan menggunakan injeksi
module.value
. Ini mengikuti cara sudut karena kami memiliki yang berikut: injeksi dependensi konstruktor, kode pengontrol yang dapat digunakan kembali, templat pengontrol yang dapat digunakan kembali (div pengontrol dapat dengan mudah dimasukkan dengan ng-include), sistem unit-testable yang mudah tanpa HTML, dan terakhir dapat digunakan kembali modul sebagai kendaraan untuk menjahit potongan.Ini sebuah contoh:
Lihat dalam aksi: jsFiddle .
sumber
Seperti @akonsu dan Nigel Findlater menyarankan, Anda dapat membaca url mana url adalah
index.html#/user/:id
dengan$routeParams.id
dan menggunakannya dalam controller.aplikasi Anda:
layanan sumber daya
controller
kemudian,
elm
dapat diakses dalam tampilan tergantung padaid
.sumber
Jika
ng-init
bukan karena meneruskan objek$scope
, Anda selalu dapat menulis arahan Anda sendiri. Jadi inilah yang saya dapat:http://jsfiddle.net/goliney/89bLj/
Javasript:
Html:
Tetapi pendekatan saya hanya bisa memodifikasi objek, yang sudah didefinisikan pada controller.
sumber
Sepertinya solusi terbaik untuk Anda sebenarnya adalah arahan. Ini memungkinkan Anda untuk tetap memiliki pengontrol Anda, tetapi menentukan properti khusus untuk itu.
Gunakan ini jika Anda memerlukan akses ke variabel dalam lingkup pembungkus:
Gunakan ini jika Anda tidak memerlukan akses ke variabel dalam lingkup pembungkus:
sumber
Saya menemukan variabel lewat dari $ routeProvider berguna.
Misalnya, Anda menggunakan satu kontroler MyController untuk beberapa layar, melewati beberapa variabel penting "mySuperConstant" di dalamnya.
Gunakan struktur sederhana itu:
sumber
Anda dapat melakukannya saat mengatur rute misalnya
Dan kemudian menggunakannya sebagai
Jadi di sini ketika kita mengatur rute yang kami kirim: itemType dan retrive nanti dari $ routeParams.
sumber
Ada cara lain untuk meneruskan parameter ke controller dengan menyuntikkan $ routeParams ke controller Anda dan kemudian menggunakan parameter url yang dijelaskan di sini Apa cara paling ringkas untuk membaca parameter kueri di AngularJS?
sumber
Pertanyaan ini sudah lama tetapi saya berjuang untuk waktu yang lama mencoba mendapatkan jawaban untuk masalah ini yang akan bekerja untuk kebutuhan saya dan tidak mudah menemukannya. Saya percaya solusi saya berikut ini jauh lebih baik daripada yang diterima saat ini, mungkin karena sudut telah menambahkan fungsionalitas sejak pertanyaan ini awalnya diajukan.
Jawaban singkat, menggunakan metode Module.value memungkinkan Anda untuk meneruskan data ke konstruktor pengontrol.
Lihat penyedot saya di sini
Saya membuat objek model, lalu mengaitkannya dengan pengontrol modul, merujuknya dengan nama 'model'
HTML / JS
Konstruktor di controller saya kemudian menerima parameter dengan 'model' pengidentifikasi yang sama yang kemudian dapat diakses.
Pengendali
Catatan:
Saya menggunakan inisialisasi manual bootstrap , yang memungkinkan saya untuk menginisialisasi model saya sebelum mengirimnya ke sudut. Ini memainkan jauh lebih baik dengan kode yang ada, karena Anda dapat menunggu untuk menyiapkan data yang relevan dan hanya mengkompilasi bagian sudut dari aplikasi Anda sesuai permintaan saat Anda mau.
Dalam plunker saya telah menambahkan tombol untuk mengingatkan nilai-nilai objek model yang awalnya didefinisikan dalam javascript dan diteruskan ke sudut, hanya untuk mengonfirmasi bahwa sudut benar-benar merujuk objek model, daripada menyalinnya dan bekerja dengan salinan.
Di baris ini:
Saya meneruskan objek MyController ke fungsi Module.controller, daripada mendeklarasikan sebagai fungsi inline. Saya pikir ini memungkinkan kita untuk mendefinisikan objek controller kita dengan lebih jelas, tetapi dokumentasi Angular cenderung melakukannya secara inline, jadi saya pikir ini memerlukan klarifikasi.
Saya menggunakan sintaks "controller as" dan memberikan nilai ke properti "this" dari MyController, daripada menggunakan variabel "$ scope". Saya percaya ini akan bekerja dengan baik menggunakan $ scope juga, tugas controller akan terlihat seperti ini:
dan konstruktor controller akan memiliki tanda tangan seperti ini:
Jika karena alasan apa pun yang Anda inginkan, Anda juga bisa melampirkan model ini sebagai nilai dari modul kedua, yang kemudian Anda lampirkan sebagai ketergantungan pada modul utama Anda.
Saya percaya solusinya jauh lebih baik daripada yang diterima saat ini karena
Cara Angular tampaknya bekerja di sebagian besar semua contoh lain yang pernah saya lihat memiliki controller mendefinisikan data model, yang tidak pernah masuk akal bagi saya, tidak ada pemisahan antara model dan controller, yang tidak benar-benar tampak seperti MVC bagiku. Solusi ini memungkinkan Anda untuk benar-benar memiliki objek model yang benar-benar terpisah yang Anda lewati ke controller. Yang juga perlu diperhatikan, jika Anda menggunakan perintah ng-include Anda dapat meletakkan semua html sudut Anda dalam file terpisah, sepenuhnya memisahkan tampilan model Anda dan pengontrol menjadi potongan modular terpisah.
sumber
Jika menggunakan angular-ui-router, maka ini adalah solusi yang tepat: https://github.com/angular-ui/ui-router/wiki#resolve
Pada dasarnya, Anda mendeklarasikan seperangkat dependecies untuk "menyelesaikan" sebelum controller dipakai. Anda dapat mendeklarasikan dependensi untuk masing-masing "negara" Anda. Ketergantungan ini kemudian diteruskan dalam "konstruktor" pengontrol.
sumber
Salah satu cara untuk melakukan itu adalah memiliki layanan terpisah yang dapat digunakan sebagai 'kapal' untuk argumen di mana mereka adalah anggota data publik.
sumber
Saya tidak terlalu menyukai solusi apa pun di sini untuk kasus penggunaan khusus saya, jadi saya pikir saya akan memposting apa yang saya lakukan karena saya tidak melihatnya di sini.
Saya hanya ingin menggunakan pengontrol lebih seperti arahan, dalam loop ng-repeat:
Sekarang, untuk mengakses
objParameter
kreasi on dalam setiap DirectiveLikeController (atau untuk mendapatkan objParameter terkini kapan saja), yang perlu saya lakukan adalah menyuntikkan $ scope dan menelepon$scope.$eval('objParameter')
:Satu-satunya downside nyata yang saya lihat adalah bahwa ia membutuhkan pengendali induk untuk mengetahui bahwa parameter tersebut dinamai
objParameter
.sumber
Tidak, itu tidak mungkin. Saya pikir Anda dapat menggunakan ng-init sebagai hack http://docs.angularjs.org/api/ng.directive:ngInit .
sumber
ng-init
terjadi - lihat plnkr.co/edit / donCm6FRBSX9oENXh9WJ? p = previewBerikut ini adalah solusi (berdasarkan saran Marcin Wyszynski) yang berfungsi di mana Anda ingin memberikan nilai ke controller Anda tetapi Anda tidak secara eksplisit mendeklarasikan controller di html Anda (yang tampaknya diperlukan oleh ng-init) - jika, misalnya, Anda merender template Anda dengan ng-view dan mendeklarasikan masing-masing controller untuk rute yang sesuai melalui routeProvider.
JS
html
Dalam solusi ini, CurrentUser adalah layanan yang dapat disuntikkan ke pengontrol apa pun, dengan properti .name yang tersedia.
Dua catatan:
masalah yang saya temui adalah .name akan diatur setelah controller dimuat, jadi sebagai solusinya saya memiliki batas waktu singkat sebelum memberikan nama pengguna pada ruang lingkup controller. Apakah ada cara menunggu yang rapi sampai nama telah ditentukan pada layanan?
ini terasa seperti cara yang sangat mudah untuk mendapatkan pengguna saat ini ke Aplikasi Angular Anda dengan semua otentikasi disimpan di luar Angular. Anda bisa memiliki before_filter untuk mencegah pengguna yang tidak masuk log masuk ke html tempat aplikasi Angular Anda di-boot, dan di dalam html itu Anda bisa menginterpolasi nama pengguna yang masuk dan bahkan ID mereka jika Anda ingin berinteraksi dengan detail pengguna melalui permintaan http dari aplikasi Angular Anda. Anda dapat mengizinkan pengguna yang tidak masuk untuk menggunakan Aplikasi Angular dengan 'pengguna tamu' default. Setiap saran tentang mengapa pendekatan ini buruk akan diterima - rasanya terlalu mudah untuk masuk akal!)
sumber
Ini adalah perluasan dari jawaban luar biasa @Michael Tiller . Jawabannya berfungsi untuk menginisialisasi variabel dari tampilan dengan menyuntikkan
$attrs
objek ke controller. Masalah terjadi jika pengontrol yang sama dipanggil dari$routeProvider
saat Anda menavigasi dengan perutean. Kemudian Anda mendapatkan kesalahan injectorUnknown provider : $attrsProvider
karena$attrs
hanya tersedia untuk injeksi ketika tampilan dikompilasi. Solusinya adalah untuk melewati variabel (foo) melalui$routeParams
ketika menginisialisasi pengontrol dari rute dan$attrs
ketika menginisialisasi pengontrol dari tampilan. Inilah solusi saya.Dari Route
Ini menangani url seperti
'/mypage/bar'
. Seperti yang Anda lihat, foo dilewatkan oleh param url dan kami menyediakan$injector
objek kosong$attrs
agar tidak ada kesalahan injektor.Dari View
Sekarang controller
sumber