Saya mencoba menggunakan ng-model pada tag input dengan tipe file:
<input type="file" ng-model="vm.uploadme" />
Tetapi setelah memilih file, di controller, $ scope.vm.uploadme masih belum ditentukan.
Bagaimana cara mendapatkan file yang dipilih di controller saya?
angularjs
angularjs-ng-model
angularjs-fileupload
Endy Tjahjono
sumber
sumber
Jawaban:
Saya membuat solusi dengan arahan:
Dan tag input menjadi:
Atau jika hanya definisi file yang diperlukan:
sumber
Saya menggunakan arahan ini:
dan panggil seperti ini:
Properti (editItem.editItem._attachments_uri.image) akan diisi dengan konten file yang Anda pilih sebagai data-uri (!).
Harap perhatikan bahwa skrip ini tidak akan mengunggah apa pun. Itu hanya akan mengisi model Anda dengan isi file Anda yang dikodekan dengan data-uri (base64).
Lihat demo yang berfungsi di sini: http://plnkr.co/CMiHKv2BEidM9SShm9Vv
sumber
ngModel
's$render
fungsi?Cara mengaktifkan
<input type="file">
untuk bekerja dengannyang-model
Demo Kerja Petunjuk yang Bekerja dengan
ng-model
ng-model
Arahan inti tidak bekerja dengan di<input type="file">
luar kotak.Direktif kebiasaan ini memungkinkan
ng-model
dan memiliki manfaat tambahan memungkinkanng-change
,ng-required
danng-form
arahan untuk bekerja dengan<input type="file">
.sumber
Ini merupakan tambahan untuk solusi @ endy-tjahjono.
Saya akhirnya tidak bisa mendapatkan nilai unggah dari ruang lingkup. Meskipun uploadme dalam HTML tampak diperbarui oleh arahan, saya masih tidak dapat mengakses nilainya dengan $ scope.uploadme. Saya bisa mengatur nilainya dari ruang lingkup. Misterius, benar ..?
Ternyata, ruang lingkup anak dibuat oleh arahan, dan ruang lingkup anak memiliki uploadme sendiri .
Solusinya adalah menggunakan objek daripada primitif untuk menyimpan nilai uploadme .
Dalam controller saya punya:
dan dalam HTML:
Tidak ada perubahan pada arahan.
Sekarang, semuanya berfungsi seperti yang diharapkan. Saya bisa mengambil nilai uploadme.src dari controller saya menggunakan $ scope.uploadme.
sumber
$scope.uploadme = { src: '' }
Hai teman-teman saya membuat arahan dan terdaftar di bower.
Lib ini akan membantu Anda memodelkan file input, tidak hanya mengembalikan data file tetapi juga file dataurl atau basis 64.
https://github.com/mistralworks/ng-file-model/
Semoga akan membantu Anda
sumber
reader.readAsDataURL
metode adalah usang. Kode modern menggunakan URL.create ObjectURL () .Ini adalah versi yang sedikit dimodifikasi yang memungkinkan Anda menentukan nama atribut dalam ruang lingkup, seperti yang akan Anda lakukan dengan ng-model, penggunaan:
Pengarahan:
sumber
Untuk input beberapa file menggunakan lodash atau garis bawah:
sumber
sumber
Saya harus melakukan hal yang sama pada beberapa input, jadi saya memperbarui metode @Endy Tjahjono. Ini mengembalikan array yang berisi semua file yang dibaca.
sumber
Saya harus memodifikasi arahan Endy sehingga saya bisa mendapatkan Last Modified, lastModifiedDate, nama, ukuran, jenis, dan data serta bisa mendapatkan array file. Bagi Anda yang membutuhkan fitur tambahan ini, ini dia.
UPDATE: Saya menemukan bug di mana jika Anda memilih file (s) dan kemudian pergi untuk memilih lagi tetapi membatalkan sebagai gantinya, file tidak pernah terpilih seperti itu muncul. Jadi saya memperbarui kode saya untuk memperbaikinya.
sumber
Jika Anda menginginkan sesuatu yang sedikit lebih elegan / terintegrasi, Anda dapat menggunakan dekorator untuk memperluas
input
arahan dengan dukungantype=file
. Peringatan utama yang perlu diingat adalah bahwa metode ini tidak akan berfungsi di IE9 karena IE9 tidak mengimplementasikan File API . Menggunakan JavaScript untuk mengunggah data biner apa pun jenisnya melalui XHR sama sekali tidak mungkin secara bawaan di IE9 atau sebelumnya (penggunaanActiveXObject
untuk mengakses sistem file lokal tidak masuk hitungan karena menggunakan ActiveX hanya meminta masalah keamanan).Metode yang tepat ini juga memerlukan AngularJS 1.4.x atau yang lebih baru, tetapi Anda mungkin dapat mengadaptasi ini untuk digunakan
$provide.decorator
daripadaangular.Module.decorator
- Saya menulis inti ini untuk menunjukkan cara melakukannya sambil menyesuaikan dengan panduan gaya AngularJS John Papa :Mengapa ini tidak dilakukan sejak awal? Dukungan AngularJS dimaksudkan untuk menjangkau hanya sejauh IE9. Jika Anda tidak setuju dengan keputusan ini dan berpikir mereka seharusnya memasukkannya, maka lompati kereta ke Angular 2+ karena dukungan modern yang lebih baik adalah alasan mengapa Angular 2 ada.
sumber
Coba ini, ini bekerja untuk saya di JS sudut
sumber