En fait, j'ai roulé ma propre uploader une fois... mais seulement parce que je n'aimais pas l'un de la déjà fait de JQuery. Malheureusement ce n'est propriétaire et je ne peux pas le publier sur internet... mais... je peux vous montrer comment utiliser n'importe quel plugin JQuery Angulaires:
Quelqu'un va sans doute dire que son facile à utiliser un programme de téléchargement et de les intégrer dans AngularJS - ce que je vais dire: si son facile alors quelqu'un aurait déjà fait.
Nous allons supposer que j'ai un plugin jQuery qui fonctionne en sélectionnant un div et en appelant pluginUploadCall()
sur...
app.directive('myJqueryPluginUploader', function() {
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
// elem is a jQuery lite object
// or a jQuery object if jQuery is present.
// so call whatever plugins you have.
elem.pluginUploadCall();
}
};
});
Et voici comment il serait utilisé.
<div my-jquery-plugin-uploader></div>
Angulaire intègre très bien avec jQuery donc tous les plugins qui fonctionnent en jQuery devrait fonctionner assez facilement dans Angulaire. La seule trickiness vient quand vous voulez garder l'Injection de Dépendance en vie, donc vous pouvez garder votre Angulaire Application testable. JQuery n'est pas très bon à la DI, de sorte que vous pouvez avoir à sauter à travers des cerceaux.
Si vous voulais faire rouler votre propre, je peux vous dire que j'ai fait quelque chose comme ceci:
app.directive('customUploader', function(){
return {
restrict: 'E',
scope: {},
template: '<div class="custom-uploader-container">Drop Files Here<input type="file" class="custom-uploader-input"/><button ng-click="upload()" ng-disabled="notReady">Upload</button></div>',
controller: function($scope, $customUploaderService) {
$scope.notReady = true;
$scope.upload = function() {
//scope.files is set in the linking function below.
$customUploaderService.beginUpload($scope.files);
};
$customUploaderService.onUploadProgress = function(progress) {
//do something here.
};
$customUploaderService.onComplete = function(result) {
// do something here.
};
},
link: function(scope, elem, attr, ctrl) {
fileInput = elem.find('input[type="file"]');
fileInput.bind('change', function(e) {
scope.notReady = e.target.files.length > 0;
scope.files = [];
for(var i = 0; i < e.target.files.length; i++) {
//set files in the scope
var file = e.target.files[i];
scope.files.push({ name: file.name, type: file.type, size: file.size });
}
});
}
});
Où $customUploaderService
serait un service personnalisé que vous créez avec Module.factory()
qui utilise $http
poster les fichiers et vérifier la progression sur le serveur.
Je sais que c'est vague, et je suis désolé c'est tout ce que je peux fournir, mais j'espère que ça aide.
EDIT: Le glisser-déposer le fichier de téléchargement est un peu un truc de CSS, BTW... pour google Chrome et FF, ce que vous faire est de mettre la dans un div contenant... de faire quelque chose comme ceci:
<div class="uploadContainer">Drop Files Here<input type="file"/></div>
div.uploadContainer {
position: relative;
width: 600px;
height: 100px;
}
div.uploadContainer input[type=file] {
visibility: hidden;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
... maintenant, tout ce que vous tomber sur cette div sera vraiment être tombé sur l'upload de fichier, et vous pouvez faire la div ressembler à ce que vous voulez.