Eu sou novo em angular. Estou tentando ler o caminho do arquivo carregado no campo 'arquivo' do HTML sempre que uma 'alteração' acontece nesse campo. Se eu usar o 'onChange', ele funcionará, mas quando o usar de maneira angular, usando o 'ng-change', não funcionará.
<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 () nunca está chamando. O Firebug também não mostra nenhum erro.
Respostas:
Nenhum suporte de ligação para o controle de Upload de Arquivos
https://github.com/angular/angular.js/issues/1375
ao invés de
você pode tentar
e na sua função muda em vez de
você pode tentar
Abaixo está um exemplo prático de upload de arquivo com arrastar e soltar upload de arquivo pode ser útil http://jsfiddle.net/danielzen/utp7j/
Informações de upload de arquivo angular
URL para upload de arquivo AngularJS no ASP.Net
http://cgeers.com/2013/05/03/angularjs-file-upload/
Upload de vários arquivos nativos do AngularJs com progresso com o NodeJS
http://jasonturim.wordpress.com/2013/09/12/angularjs-native-multi-file-upload-with-progress/
ngUpload - um serviço AngularJS para fazer upload de arquivos usando iframe
http://ngmodules.org/modules/ngUpload
fonte
sqren
a solução ... ... ... @ 0MV1Fiz uma pequena diretiva para ouvir as alterações na entrada do arquivo.
Exibir JSFiddle
view.html:
controller.js:
Directive.js:
fonte
Este é um refinamento de alguns dos outros, os dados acabam em um modelo ng, que normalmente é o que você deseja.
Marcação (basta criar um arquivo de dados de atributo para que a diretiva possa encontrá-lo)
JS
fonte
$scope.$apply();
obrigatório? Meung-change
evento ainda parece disparar sem ele.A maneira limpa é escrever sua própria diretiva para vincular ao evento "change". Apenas para informar que o IE9 não suporta FormData, você não pode realmente obter o objeto de arquivo do evento de alteração.
Você pode usar a biblioteca ng-upload de arquivos que já suporta o IE com o polyfill FileAPI e simplificar a postagem do arquivo no servidor. Ele usa uma diretiva para conseguir isso.
JS:
fonte
Eu expandi a ideia de @Stuart Axon para adicionar ligação bidirecional para a entrada do arquivo (ou seja, permitir redefinir a entrada redefinindo o valor do modelo para nulo):
Demo
fonte
data-ng-click="vm.theFile=''"
funciona bem, não há necessidade de escrevê-lo a um método de controladorSemelhante a algumas das outras boas respostas aqui, escrevi uma diretiva para resolver esse problema, mas essa implementação reflete mais de perto a maneira angular de anexar eventos.
Você pode usar a diretiva assim:
HTML
Como você pode ver, você pode injetar os arquivos selecionados em seu manipulador de eventos, como injetaria um objeto $ event em qualquer manipulador de eventos ng.
Javascript
fonte
fileChange
expressão? Estou usando esta diretiva dentro de umng-repeat
e a$scope
variável passada paraattrHandler
é a mesma para cada registro. Qual a melhor solução?Esta diretiva passa os arquivos selecionados também:
O HTML, como usá-lo:
No meu controlador:
fonte
Eu recomendo criar uma diretiva
Essa diretiva pode ser usada várias vezes, usa seu próprio escopo e não depende do escopo pai. Você também pode fornecer alguns parâmetros para a função de manipulador. A função do manipulador será chamada com o objeto de escopo, que estava ativo quando você alterou a entrada. $ apply atualiza seu modelo sempre que o evento de mudança é chamado
fonte
A versão mais simples do jqLite Angular.
JS:
HTML:
fonte
Demonstração de trabalho da diretiva "entrada de arquivos" que funciona com
ng-change
1Para que um
<input type=file>
elemento funcione na diretiva ng-change , ele precisa de uma diretiva personalizada que funcione com a diretiva ng-model .A DEMO
fonte
Base de solução muito completa em:
Uma maneira simples de ocultar o campo de entrada e substituí-lo por uma imagem, aqui após uma solução, que também exige um hack no angular, mas que faz o trabalho [TriggerEvent não funciona conforme o esperado]
A solução:
Quando a imagem é clicada, simule uma ação do DOM 'clique' no campo de entrada. Et voilà!
fonte
Eu fiz assim;
fonte
Outra maneira interessante de ouvir as alterações na entrada do arquivo é observando o atributo ng-model do arquivo de entrada. Claro que o FileModel é uma diretiva personalizada.
Como isso:
HTML ->
<input type="file" file-model="change.fnEvidence">
Código JS ->
Espero que possa ajudar alguém.
fonte
Elementos angulares (como o elemento raiz de uma diretiva) são objetos jQuery [Lite]. Isso significa que podemos registrar o ouvinte de eventos da seguinte maneira:
Esta é a delegação de eventos jQuery. Aqui, o ouvinte é anexado ao elemento raiz da diretiva. Quando o evento é acionado, ele borbulha para o elemento registrado e o jQuery determina se o evento se originou em um elemento interno que corresponde ao seletor definido. Se isso acontecer, o manipulador será acionado.
Os benefícios deste método são:
ng-if
oung-switch
)http://api.jquery.com/on/
fonte
Você pode simplesmente adicionar o código abaixo no onchange e ele detectará alterações. você pode escrever uma função no X click ou algo para remover os dados do arquivo.
fonte