Eu tentei usar o ng-model na tag de entrada com o tipo file:
<input type="file" ng-model="vm.uploadme" />
Mas depois de selecionar um arquivo, no controlador, $ scope.vm.uploadme ainda está indefinido.
Como obtenho o arquivo selecionado no meu controlador?
angularjs
angularjs-ng-model
angularjs-fileupload
Endy Tjahjono
fonte
fonte
Respostas:
Eu criei uma solução alternativa com diretiva:
E a tag de entrada se torna:
Ou, se apenas a definição do arquivo for necessária:
fonte
Eu uso esta diretiva:
e invoque-o assim:
A propriedade (editItem.editItem._attachments_uri.image) será preenchida com o conteúdo do arquivo que você selecionar como uri de dados (!).
Observe que este script não carregará nada. Ele somente preencherá seu modelo com o conteúdo do seu arquivo codificado e um data-uri (base64).
Confira uma demonstração de trabalho aqui: http://plnkr.co/CMiHKv2BEidM9SShm9Vv
fonte
ngModel
da$render
função?Como habilitar
<input type="file">
para trabalhar comng-model
Demonstração de trabalho da diretiva que funciona com
ng-model
A
ng-model
diretiva principal não funciona<input type="file">
imediatamente.Esta directiva personalizado permite
ng-model
e tem a vantagem adicional de permitir que osng-change
,ng-required
eng-form
directivas para trabalhar com<input type="file">
.fonte
Este é um adendo à solução do @ endy-tjahjono.
Acabei não conseguindo obter o valor de uploadme do escopo. Mesmo que uploadme no HTML tenha sido visivelmente atualizado pela diretiva, eu ainda não consegui acessar seu valor com $ scope.uploadme. Eu era capaz de definir seu valor do escopo, no entanto. Misterioso, certo ..?
Como se viu, um escopo filho foi criado pela diretiva e o escopo filho teve seu próprio uploadme .
A solução foi usar um objeto em vez de um primitivo para armazenar o valor de uploadme .
No controlador eu tenho:
e no HTML:
Não há alterações na diretiva.
Agora, tudo funciona como o esperado. Posso pegar o valor de uploadme.src do meu controlador usando $ scope.uploadme.
fonte
$scope.uploadme = { src: '' }
Oi pessoal, eu crio uma diretiva e registrei no caramanchão.
essa lib o ajudará a modelar o arquivo de entrada, não apenas retornará dados do arquivo, mas também o dataurl do arquivo ou a base 64.
https://github.com/mistralworks/ng-file-model/
A esperança o ajudará
fonte
reader.readAsDataURL
método está obsoleto. O código moderno usa URL.create ObjectURL () .Esta é uma versão ligeiramente modificada que permite especificar o nome do atributo no escopo, assim como você faria com o ng-model, use:
Directiva:
fonte
Para entrada de vários arquivos usando lodash ou sublinhado:
fonte
fonte
Eu tive que fazer o mesmo em várias entradas, então atualizei o método @Endy Tjahjono. Retorna uma matriz contendo todos os arquivos lidos.
fonte
Eu tive que modificar a diretiva de Endy para obter Last Modified, lastModifiedDate, nome, tamanho, tipo e dados, além de poder obter uma matriz de arquivos. Para aqueles de vocês que precisavam desses recursos extras, aqui está.
ATUALIZAÇÃO: Encontrei um bug no qual, se você selecionar o (s) arquivo (s) e depois selecionar novamente, mas cancelar, os arquivos nunca serão desmarcados como parece. Então atualizei meu código para corrigir isso.
fonte
Se você quiser algo um pouco mais elegante / integrado, use um decorador para estender a
input
diretiva com suportetype=file
. A principal ressalva a ser lembrada é que esse método não funcionará no IE9, pois o IE9 não implementou a API de arquivos . O uso de JavaScript para fazer upload de dados binários, independentemente do tipo via XHR, simplesmente não é possível nativamente no IE9 ou anterior (uso deActiveXObject
para acessar o sistema de arquivos local não conta, pois o uso do ActiveX está apenas solicitando problemas de segurança).Esse método exato também requer o AngularJS 1.4.x ou posterior, mas você pode adaptá-lo para usá-lo em
$provide.decorator
vez deangular.Module.decorator
- escrevi essa essência para demonstrar como fazê-lo, em conformidade com o guia de estilo do John Papa no AngularJS :Por que isso não foi feito em primeiro lugar? O suporte ao AngularJS deve atingir apenas o IE9. Se você não concorda com essa decisão e acha que eles deveriam simplesmente colocar isso de qualquer maneira, vá para o Angular 2+, pois melhor suporte moderno é literalmente o motivo pelo qual o Angular 2 existe.
fonte
Tente isso, isso está funcionando para mim em JS angular
fonte