2012-06-30 9 views
9

Sto lavorando a un'app con caricamenti di file. Voglio creare un componente di caricamento file riutilizzabile che possa essere incluso in qualsiasi pagina che richiede funzionalità di caricamento file. Inizialmente pensavo di poter usare solo un tag JSP. Tuttavia, abbiamo recentemente scoperto AngularJS e ora vogliamo utilizzarlo in tutta l'app. Quindi, voglio creare una direttiva che mi permetta di inserire semplicemente un tag <myApp-upload> da inserire nella mia funzionalità di upload.Creazione della direttiva AngularJS con Plupload

Per prima cosa ho reso la mia funzionalità di caricamento la propria pagina HTML per assicurarmi che AngularJS stesse giocando bene con il plugin Plupload. Ho messo insieme qualcosa di simile:

<html ng-app="myApp"> 
<head> 
    <script src="resources/scripts/angular-1.0.1.min.js"></script> 
    <script src="resources/scripts/myApp.js"></script> 
</head> 
<body> 
    <style type="text/css">@import url(resources/scripts/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css);</style> 
    <script type="text/javascript" src="resources/scripts/jquery-1.7.2.min.js"></script> 

    <script type="text/javascript" src="resources/scripts/plupload/plupload.full.js"></script> 
    <script type="text/javascript" src="resources/scripts/plupload/jquery.plupload.queue/jquery.plupload.queue.js"></script> 

    <div id="uploadContainer" ng-controller="FileUploadCtrl"> 
     <div id="dropArea" style="border: 1px black dashed;">Drag files to here<br><br><br></div> 
     Files to upload:<br> 
     <div ng-repeat="currFile in uploader.files">{{currFile.name}} ({{currFile.size}})</div> 
     <br><br> 
     <!-- For debugging --> 
     {{uploader.files}} 
    </div> 
</body> 
</html> 

I myApp.js assomiglia a questo:

function FileUploadCtrl($scope) 
{ 
    $scope.uploader = new plupload.Uploader({ 
     runtimes : 'html5,flash,html4', 
     url : 'media/upload', 
     max_file_size : '10mb', 
     container: 'uploadContainer', 
     drop_element: 'dropArea' 
    }); 

    $scope.uploader.init(); 

    $scope.uploader.bind('FilesAdded', function(up, files) { 
     $scope.$apply(); 
    }); 
} 

Quando ho trascinare i file in, vedo compaiono i nomi dei file e l'uscita di {{uploader.files }} cambia da [] ai file nell'oggetto uploader. Quindi, ora voglio farne una direttiva. Prendo tutto il contenuto che si trova nel tag body e lo salvi in ​​un file chiamato upload.html. Ho poi aggiunto quanto segue al myApp.js:

angular.module('myApp', []) 
.directive('myAppUpload', function() { 
    return { 
     restrict: 'E', 
     templateUrl: 'upload.html', 
    }; 
}); 

allora, ho un file HTML come questo:

<html ng-app="myApp"> 
<head> 
    <script src="resources/scripts/angular-1.0.1.min.js"></script> 
    <script src="resources/scripts/myApp.js"></script> 
</head> 
<body> 
    <myApp-upload> 
     This will be replaced 
    </myApp-upload> 
</body> 
</html> 

Quando carico questa pagina HTML, il tag <myApp-upload> fa portare nel caricamento. file html. Tuttavia, non esegue alcuna associazione di dati. In basso vedo {{uploader.files}} invece di [] che stavo vedendo inizialmente quando era la sua pagina.

Sono molto nuovo ad AngularJS, quindi sono sicuro che mi manca qualcosa o sto facendo qualcosa di sbagliato. Come faccio a far funzionare questa direttiva?

+0

Assicuratevi di controllare la [lista violini] (https://github.com/angular/angular.js/wiki/JsFiddle-Examples) per un [drag and drop esempio di upload] (http: //jsfiddle.net/danielzen/utp7j/) fatto da qualcuno. –

+0

Bene, il drag and drop funziona bene quando tutte le funzionalità sono la propria pagina html. Sto solo volendo sapere cosa sto facendo male con la direttiva che lo rende non funziona. – dnc253

risposta

3

Ho capito il mio problema. Stavo includendo tutti i javascript e i CSS sulla mia pagina HTML del modello. Ho provato a spostarlo nel file HTML principale e poi ha funzionato. In altre parole, ho spostato

<style type="text/css">@import url(resources/scripts/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css);</style> 
<script type="text/javascript" src="resources/scripts/jquery-1.7.2.min.js"></script> 

<script type="text/javascript" src="resources/scripts/plupload/plupload.full.js"></script> 
<script type="text/javascript" src="resources/scripts/plupload/jquery.plupload.queue/jquery.plupload.queue.js"></script> 

dal file upload.html al file principale, index.html.

Il javascript stava morendo quando si cercava di chiamare alcune cose di Plupload nella sceneggiatura che non aveva ancora avuto la possibilità di essere incluse.

1

Abbiamo appena creato una direttiva Angular per plUpload. Controlla qui

http://plupload-angular-directive.sahusoft.info/

+0

Ho usato questa direttiva nel mio progetto ma non funziona per IE 9 sta restituendo json da scaricare nel browser per il download per la prima volta e dal prossimo in poi non funziona. Per favore aiuto. – KanhuP2012

+0

Dovrebbe funzionare su IE9, non ho un ambiente da testare su IE9. Se questo non funziona, dovresti provare a utilizzare https://blueimp.github.io/jQuery-File-Upload/angularjs.html –

+0

documentazione appropriata non fornita. –