J'essaie d'accéder à la valeur du fichier d'entrée à partir de mon application ionic 2 mais je suis toujours confronté au problème des fichiers de propriétés qui n'existent pas sur le type 'EventTarget' . Comme il fonctionne correctement dans js mais pas dans TypeScript . Le code est donné ci-dessous:
document.getElementById("customimage").onchange= function(e?) {
var files: any = e.target.files[0];
EXIF.getData(e.target.files[0], function() {
alert(EXIF.getTag(this,"GPSLatitude"));
});
}
S'il vous plaît, aidez-moi à résoudre ce problème car il ne construit pas mon application ionique 2.
Le type de propriété e.target
dépend de l'élément que vous renvoyez sur getElementById(...)
. files
est une propriété de input
élément: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
Dans ce cas, le compilateur TypeScript ne sait pas que vous retournez un élément input
et nous n'avons pas de classe Event
spécifique à cet effet. Donc, vous pouvez en créer un comme le code suivant:
interface HTMLInputEvent extends Event {
target: HTMLInputElement & EventTarget;
}
document.getElementById("customimage").onchange = function(e?: HTMLInputEvent) {
let files: any = e.target.files[0];
//...
}
Vous pouvez le convertir en HTMLInputElement :
document.getElementById("customimage").onchange= function(e: Event) {
let file = (<HTMLInputElement>e.target).files[0];
//rest of your code...
}
La solution la plus simple est de déclarer e
comme any
par exemple
document.getElementById('customimage').onchange = (e: any) => {
let files = e.target.files[0];
...
};
Mais vous perdez des informations de type. Une approche plus sûre pourrait consister à déclarer votre propre type FileEvent
en fonction de https://developer.mozilla.org/en-US/docs/Web/API/FileReader/onload .
C'est plus de lignes, mais je pense que c'est le plus clair.
const onChange = (event: Event) => {
const target= event.target as HTMLInputElement;
const file: File = (target.files as FileList)[0];
/** do something with the file **/
};
J'ai trouvé que:
<input type="file" accept="image/*"
(change)="upload($event)">
et
<ion-input type="file" accept="image/*"
(change)="upload($event)"><ion-input> or (ionChange)
ne gère pas l'événement de la même manière. Par conséquent, event.target
est composé de différents paramètres.
Je n'ai donc pas utilisé la balise ion-input
, mais la balise angulaire <input>
normale avec le déclencheur (change)="upload($event)"
.
Cela a fonctionné pour moi sur Ionic 4.