Próbowałem użyć modelu ng na znaczniku wejściowym z plikiem typu:
<input type="file" ng-model="vm.uploadme" />
Ale po wybraniu pliku w kontrolerze $ scope.vm.uploadme jest nadal niezdefiniowany.
Jak uzyskać wybrany plik w moim kontrolerze?
angularjs
angularjs-ng-model
angularjs-fileupload
Endy Tjahjono
źródło
źródło
Odpowiedzi:
Stworzyłem obejście z dyrektywą:
Tag wejściowy staje się:
Lub jeśli potrzebna jest tylko definicja pliku:
źródło
Korzystam z tej dyrektywy:
i wywołaj to w ten sposób:
Właściwość (editItem.editItem._attachments_uri.image) zostanie wypełniona zawartością pliku wybranego jako data-uri (!).
Pamiętaj, że ten skrypt niczego nie załaduje. Zapełni on tylko Twój model zawartością pliku zakodowanego w pliku danych i danych (base64).
Sprawdź działające demo tutaj: http://plnkr.co/CMiHKv2BEidM9SShm9Vv
źródło
ngModel
„s$render
funkcję?Jak włączyć
<input type="file">
pracę zng-model
Demonstracja robocza dyrektywy, która działa
ng-model
Podstawowa
ng-model
dyrektywa nie działa po<input type="file">
wyjęciu z pudełka.Dyrektywa ta pozwala na zlecenie
ng-model
i ma dodatkową zaletę umożliwieniang-change
,ng-required
orazng-form
wskazówki do pracy z<input type="file">
.źródło
To jest dodatek do rozwiązania @ endy-tjahjono.
W końcu nie byłem w stanie uzyskać wartości uploadme z zakresu. Mimo że uploadme w HTML został wyraźnie zaktualizowany przez dyrektywę, nadal nie mogłem uzyskać dostępu do jego wartości przez $ scope.uploadme. Byłem jednak w stanie ustawić jego wartość z zakresu. Tajemnicze, prawda ..?
Jak się okazało, zakres potomny został utworzony przez dyrektywę, a zakres potomny miał własny uploadme .
Rozwiązaniem było użycie obiektu zamiast prymitywu do utrzymania wartości uploadme .
W kontrolerze mam:
oraz w HTML:
Brak zmian w dyrektywie.
Teraz wszystko działa zgodnie z oczekiwaniami. Mogę pobrać wartość uploadme.src z mojego kontrolera za pomocą $ scope.uploadme.
źródło
$scope.uploadme = { src: '' }
Cześć chłopaki, stworzyłem dyrektywę i zarejestrowałem się na altanie.
ta biblioteka pomoże ci w modelowaniu pliku wejściowego, nie tylko zwróci dane pliku, ale także plik danych lub plik bazowy 64.
https://github.com/mistralworks/ng-file-model/
Nadzieja ci pomoże
źródło
reader.readAsDataURL
Metoda jest przestarzała. Nowoczesny kod używa URL.create ObjectURL () .Jest to nieznacznie zmodyfikowana wersja, która pozwala określić nazwę atrybutu w zakresie, tak jak w przypadku modelu ng, użycie:
Dyrektywa:
źródło
W przypadku wprowadzania wielu plików przy użyciu lodash lub podkreślenia:
źródło
źródło
Musiałem zrobić to samo na wielu wejściach, więc zaktualizowałem metodę @Endy Tjahjono. Zwraca tablicę zawierającą wszystkie odczytane pliki.
źródło
Musiałem zmodyfikować dyrektywę Endy, aby uzyskać Last Last, LastModifiedDate, nazwę, rozmiar, typ i dane, a także móc uzyskać tablicę plików. Dla tych z Was, którzy potrzebowali tych dodatkowych funkcji, proszę bardzo.
AKTUALIZACJA: Znalazłem błąd, w którym jeśli wybierzesz plik (i), a następnie przejdziesz do wyboru ponownie, ale zamiast tego anulujesz, pliki nigdy nie są usuwane tak, jak się wydaje. Zaktualizowałem więc mój kod, aby to naprawić.
źródło
Jeśli chcesz czegoś bardziej eleganckiego / zintegrowanego, możesz użyć dekoratora do rozszerzenia
input
dyrektywy z obsługątype=file
. Należy pamiętać, że ta metoda nie będzie działać w IE9, ponieważ IE9 nie implementuje interfejsu API plików . Używanie JavaScript do przesyłania danych binarnych niezależnie od typu za pośrednictwem XHR po prostu nie jest możliwe natywnie w IE9 lub wcześniejszym (użycieActiveXObject
do uzyskania dostępu do lokalnego systemu plików nie liczy się, ponieważ używanie ActiveX wymaga jedynie problemów z bezpieczeństwem).Ta dokładna metoda wymaga również AngularJS 1.4.x lub nowszej, ale możesz być w stanie dostosować to do użycia
$provide.decorator
zamiastangular.Module.decorator
- Napisałem tę listę, aby zademonstrować, jak to zrobić, przestrzegając przewodnika stylu AngularJS Johna Papy :Dlaczego tego nie zrobiono? Obsługa AngularJS ma sięgać tak daleko jak IE9. Jeśli nie zgadzasz się z tą decyzją i uważasz, że i tak powinni ją po prostu włożyć, przeskocz wóz na Angular 2+, ponieważ lepsze nowoczesne wsparcie jest dosłownie powodem, dla którego Angular 2 istnieje.
źródło
Spróbuj, to działa na mnie w kątowym JS
źródło