2014-08-27 7 views
6

Do przesyłania plików używam https://github.com/nervgh/angular-file-upload.Przesyłanie plików AngularJS wysyła nieaktualne dane formularza

Mam formularz, który oprócz przesłania pliku, wysyła kilka innych pól. Dla jasności, mogę wysłać tylko jedno pole w tym przykładzie:

$scope.save_with_upload = function(user) { 
    $scope.uploader.formData = [{ 
     name: user.name, 
    }]; 

    $scope.uploader.uploadAll(); 
} 

Powiedzmy wartość wejścia name jest Test 1.

  1. Kiedy po raz pierwszy załadować stronę i kliknij Zapisz, wysyła plik, ale nie wysyła formData w ogóle.
  2. Następnie zmieniam pole name na Test 2 i naciśnij Zapisz. Wysyła plik i formData, , ale ma wartość name, którą wysyła: Test 1.
  3. Następnie zmieniam pole name na Test 3 i naciśnij Zapisz. Wysyła plik i formData, , ale ma wartość name, którą wysyła: Test 2.
  4. ... i tak dalej ...

Wygląda więc na to, aby zawsze wysłać dane, które zostały przypisane do formDataprzed ostatnie wezwanie do uploadAll.

Aby wyjaśnić: jeśli wykonam dir(user, $scope.uploader.formData) tuż przed wywołaniem uploadAll, to pokazuje poprawne aktualne wartości w obu.

Zmagam się z tym przez kilka godzin i po prostu nie mogę zobaczyć, co jest nie tak. Jakieś pomysły?

Odpowiedz

12

Mocowanie pól formularza do obiektu FileItem - zamiast FileUpload - poprawia go:

uploader.onBeforeUploadItem = function(item) { 
    formData = [{ 
     name: user.name, 
    }]; 
    Array.prototype.push.apply(item.formData, formData); 
}; 

Powodem jest faktycznie wykorzystywane są ustawienia na FileItem. Gdy plik zostanie dodany do kolejki, ustawienia od FileUpload zostaną skopiowane do FileItem. Wszelkie zmiany w opcjach FileUpload wprowadzone po dodaniu pliku do kolejki nie będą miały żadnego wpływu.

+0

do czego służy to wywołanie zwrotne? Próbowałem go w kontrolerze i nie działał. Czy możesz po prostu rzucić to w widoku? – bischoffingston

+1

Również dlaczego nie możesz "item.formData.push (formData)"? – bischoffingston

+1

@bischoffingston Ten kod musi się znaleźć w kontrolerze. 'uploader' musi być instancją' FileUpload'. 'item.formData.push (formData)' oraz 'Array.prototype.push.apply (item.formData, formData)' są równoważne. –