Jestem nowy w angular. Próbuję odczytać przesłaną ścieżkę pliku z pola „pliku” HTML, ilekroć w tym polu nastąpi „zmiana”. Jeśli używam „onChange”, to działa, ale kiedy używam go pod kątem, używając „ng-change”, to nie działa.
<script>
var DemoModule = angular.module("Demo",[]);
DemoModule .controller("form-cntlr",function($scope){
$scope.selectFile = function()
{
$("#file").click();
}
$scope.fileNameChaged = function()
{
alert("select file");
}
});
</script>
<div ng-controller="form-cntlr">
<form>
<button ng-click="selectFile()">Upload Your File</button>
<input type="file" style="display:none"
id="file" name='file' ng-Change="fileNameChaged()"/>
</form>
</div>
fileNameChaged () nigdy nie wywołuje. Firebug również nie pokazuje żadnego błędu.
Odpowiedzi:
Brak obsługi wiązania dla kontroli przesyłania plików
https://github.com/angular/angular.js/issues/1375
zamiast
możesz spróbować
i w twojej funkcji zmienia się zamiast
możesz spróbować
Poniżej znajduje się jeden działający przykład przesyłania plików z przesyłaniem plików metodą przeciągnij i upuść http://jsfiddle.net/danielzen/utp7j/
Informacje o przesyłaniu plików kątowych
Adres URL do przesyłania plików AngularJS w ASP.Net
http://cgeers.com/2013/05/03/angularjs-file-upload/
AngularJs natywne przesyłanie wielu plików z postępem w NodeJS
http://jasonturim.wordpress.com/2013/09/12/angularjs-native-multi-file-upload-with-progress/
ngUpload - usługa AngularJS do przesyłania plików przy użyciu iframe
http://ngmodules.org/modules/ngUpload
źródło
sqren
rozwiązanie ... ... ... @ 0MV1Podjąłem małą dyrektywę, aby nasłuchiwać zmian wprowadzanych plików.
Zobacz JSFiddle
view.html:
controller.js:
dyrektywa.js:
źródło
Jest to udoskonalenie niektórych innych wokół, dane zostaną skończone w modelu ng, co zwykle jest tym, czego chcesz.
Znaczniki (wystarczy utworzyć plik danych atrybutu, aby dyrektywa mogła go znaleźć)
JS
źródło
$scope.$apply();
wymagane?ng-change
Wydaje się, że moje wydarzenie wciąż bez niego strzela.Najprościej jest napisać własną dyrektywę, aby powiązać zdarzenie „zmień”. Informuję, że IE9 nie obsługuje FormData, więc nie można tak naprawdę pobrać obiektu pliku ze zdarzenia zmiany.
Możesz użyć biblioteki przesyłania plików ng, która już obsługuje IE z polifillem FileAPI i uprościć wysyłanie pliku na serwer. W tym celu wykorzystuje dyrektywę.
JS:
źródło
Rozszerzyłem pomysł @Stuart Axon, aby dodać dwukierunkowe wiązanie dla danych wejściowych pliku (tzn. Zezwolić na zresetowanie danych wejściowych poprzez zresetowanie wartości modelu z powrotem do wartości null):
Próbny
źródło
data-ng-click="vm.theFile=''"
działa dobrze, nie trzeba zapisywać jej w metodzie kontroleraPodobnie jak w przypadku niektórych innych dobrych odpowiedzi tutaj, napisałem dyrektywę, aby rozwiązać ten problem, ale ta implementacja dokładniej odzwierciedla kątowy sposób dołączania zdarzeń.
Możesz użyć dyrektywy w następujący sposób:
HTML
Jak widać, możesz wstrzyknąć wybrane pliki do procedury obsługi zdarzeń, tak jak wstrzyknąłbyś obiekt $ event do dowolnej procedury obsługi zdarzeń ng.
JavaScript
źródło
fileChange
wyrażenia? Używam tej dyrektywy wewnątrzng-repeat
i$scope
przekazywana zmiennaattrHandler
jest taka sama dla każdego rekordu. Jakie jest najlepsze rozwiązanie?Niniejsza dyrektywa przekazuje również wybrane pliki:
HTML, jak go używać:
W moim kontrolerze:
źródło
Polecam stworzyć dyrektywę
ta dyrektywa może być używana wiele razy, używa własnego zakresu i nie zależy od zakresu nadrzędnego. Możesz również podać kilka parametrów funkcji obsługi. Funkcja modułu obsługi zostanie wywołana z obiektem zakresu, który był aktywny po zmianie danych wejściowych. $ Apply aktualizuje Twój model za każdym razem, gdy wywoływane jest zdarzenie zmiany
źródło
Najprostsza wersja Angular jqLite.
JS:
HTML:
źródło
Demonstracja robocza dyrektywy „file-input”, która działa z
ng-change
1Aby
<input type=file>
element działał zgodnie z dyrektywą ng-change , potrzebuje niestandardowej dyrektywy, która działa z dyrektywą ng-model .DEMO
źródło
Zbyt kompletne rozwiązanie oparte na:
Prosty sposób na ukrycie pola wejściowego i zastąpienie go obrazem, tutaj po rozwiązaniu, które również wymagają hackowania kątowego, ale wykonują zadanie [TriggerEvent nie działa zgodnie z oczekiwaniami]
Rozwiązanie:
Po kliknięciu obrazu zasymuluj działanie DOM „kliknij” w polu wejściowym. Zrobione!
źródło
Zrobiłem to w ten sposób;
źródło
Innym interesującym sposobem nasłuchiwania zmian danych wejściowych pliku jest kontrola nad atrybutem ng-model pliku wejściowego. Oczywiście FileModel to niestandardowa dyrektywa.
Lubię to:
HTML ->
<input type="file" file-model="change.fnEvidence">
Kod JS ->
Mam nadzieję, że może komuś pomóc.
źródło
Elementy kątowe (takie jak element główny dyrektywy) są obiektami jQuery [Lite]. Oznacza to, że możemy zarejestrować detektor zdarzeń w następujący sposób:
To jest delegacja zdarzenia jQuery. Tutaj nasłuchiwanie jest dołączone do elementu głównego dyrektywy. Kiedy zdarzenie zostanie wyzwolone, będzie się przesuwać do zarejestrowanego elementu, a jQuery określi, czy zdarzenie powstało na elemencie wewnętrznym pasującym do zdefiniowanego selektora. Jeśli tak, przewodnik uruchomi ogień.
Korzyści z tej metody to:
ng-if
lubng-switch
)http://api.jquery.com/on/
źródło
Możesz po prostu dodać poniższy kod w programie onchange, a on wykryje zmianę. możesz napisać funkcję na X-Click lub coś do usunięcia danych pliku.
źródło