Nella maggior parte dei violini contenenti codice di utilizzo di esempio per il caricamento di file ng (https://github.com/danialfarid/ng-file-upload) come quello in (http://jsfiddle.net/danialfarid/maqbzv15/1118/), le funzioni di richiamata risposta caricamento eseguono il loro codice in una chiamata di servizio $timeout
, ma queste chiamate non hanno alcun ritardo parametro passato in.
la documentazione Angular.js per $timeout
(https://docs.angularjs.org/api/ng/service/ $ timeout) indicano che il ritardo è facoltativo, ma perché si vuole fare una chiamata a $timeout
se non ritardare l'in esecuzione codice. In altre parole, invece di quanto segue, perché non fare quello dopo:
//inject angular file upload directives and services.
var app = angular.module('fileUpload', ['ngFileUpload']);
app.controller('MyCtrl', ['$scope', 'Upload', '$timeout', function ($scope, Upload, $timeout) {
$scope.uploadPic = function(file) {
file.upload = Upload.upload({
url: 'https://angular-file-upload-cors-srv.appspot.com/upload',
data: {username: $scope.username, file: file},
});
file.upload.then(function (response) {
$timeout(function() {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
}, function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded/evt.total));
});
}
}]);
C'è qualche ragione per la $timeout
involucro in tutti questi esempi? Sarebbe il seguente file.upload call lavorare al suo posto ?:
file.upload.then(function (response) {
file.result = response.data;
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
}, function (evt) {
// Math.min is to fix IE which reports 200% sometimes
file.progress = Math.min(100, parseInt(100.0 * evt.loaded/evt.total));
});
Edit: Vedo che sembra funzionare senza il $timeout
involucro, ma il fatto è incluso in tutti gli esempi mi fa pensare che sia intenzionale, che probabilmente significa che c'è un caso di sicurezza/robustezza/compatibilità con i browser che non capisco qui.
Grazie per questa risposta. Tuttavia, come esplicitamente menzionato dall'OP, "sembra funzionare senza il wrapper $ timeout". Puoi far luce sul motivo per cui funziona ancora senza il wrapper '$ timeout'? – rinogo
Inoltre, in base alle proprie esigenze, si può prendere in considerazione l'uso di '$ scope. $ EvalAsync()' invece di '$ timeout'. Fonte: https://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm – rinogo
@rinogo Posso solo immaginare un pezzo di codice che sta avviando il ciclo di digest. È impossibile che angular diventi consapevole delle modifiche a '$ scope' a meno che non venga avviato un digest. – maddockst