Yo! Ho un controller che ospita un gruppo di articoli sul suo $scope
. Uno degli elementi dell'ambito, $scope.openDialog
apre uno $mdDialog
tramite $mdDialog.show()
. L'oggetto passato in $mdDialog.show
ha un modello che contiene i controlli per il caricamento di file tramite il progetto ng-file-upload
, che è possibile leggere su here.
Mi piacerebbe se gli elementi caricati nella finestra di dialogo fossero disponibili nel controller principale dopo essere usciti dalla finestra di dialogo. Non sono sicuro se il controller per la finestra di dialogo debba fare riferimento al controller principale myCtrl
o utilizzarne uno e come rendere disponibili i file caricati a myCtrl
.
ecco il codice angolare:
angular.module('app', ['ngMaterial', 'ngFileUpload'])
.controller('myCtrl', ['$scope', '$mdDialog', 'Upload', function($scope, $mdDialog, Upload) {
var tmpl = "<md-dialog>\n" +
"<md-dialog-content>\n" +
" <input type=\"text\" ng-model=\"username\"></br></br>\n" +
" <input type=\"checkbox\" ng-model=\"multiple\">upload multiple file</br></br>\n" +
" watching model:\n" +
" <div class=\"button\" ngf-select ng-model=\"files\" ngf-multiple=\"multiple\">Select File</div>\n" +
" on file change:\n" +
" <div class=\"button\" ngf-select ngf-change=\"upload($files)\" ngf-multiple=\"multiple\">Select File</div>\n" +
" Drop File:\n" +
" <div ngf-drop ngf-select ng-model=\"files\" class=\"drop-box\" \n" +
" ngf-drag-over-class=\"dragover\" ngf-multiple=\"true\" ngf-allow-dir=\"true\"\n" +
" accept=\"image/*,application/pdf\">Drop pdfs or images here or click to upload</div>\n" +
" <div ngf-no-file-drop>File Drag/Drop is not supported for this browser</div>\n" +
" Image thumbnail: <img ngf-src=\"files[0]\">\n" +
" Files:\n" +
" <ul>\n" +
" <li ng-repeat=\"f in files\" style=\"font:smaller\">{{f.name}}</li>\n" +
" </ul>\n" +
" Upload Log:\n" +
" <pre>{{log}}</pre>\n" +
"<md-action><div class=\"button\" ng-click=\"close()\">close!</div></md-action>\n" +
"<md-action><div class=\"button\" ng-click=\"upload()\">upload!</div></md-action>\n" +
"</md-dialog-content>\n" +
"</md-dialog>";
$scope.files = ['files should appear here', 'files 1', 'file2'];
$scope.openDialog = function() {
$mdDialog.show({
parent: angular.element(document.body),
template: tmpl,
controller: 'myCtrl'
});
};
$scope.close = function() {
$mdDialog.hide();
};
$scope.$watch('files', function() {
$scope.upload($scope.files);
});
$scope.upload = function (files) {
if (files && files.length) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: 'upload/url',
fields: {'username': $scope.username},
file: file
}).progress(function (evt) {
var progressPercentage = parseInt(100.0 * evt.loaded/evt.total);
console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
}).success(function (data, status, headers, config) {
console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
});
}
}
};
}]);
BTW: Come nota di pulizia, sento spesso che la logica applicazione non deve essere passato in un controller. In questa situazione, come faresti spostare $scope.upload
in una fabbrica, dato che fa riferimento a $scope
e $scope
non è disponibile nelle fabbriche?
Grazie per l'aiuto.
Plnkr: http://plnkr.co/edit/e2MYdEABhj34ahtPTO0g?p=preview
@cracker, si prega di non fare nuove domande nei commenti. Detto questo, la tua domanda non è chiara. Puoi mostrare un div con uno di questi metodi. – isherwood