Bonjour � tous
Je tente d�sesp�ramment de r�cup�rer le r�sultat du fetch effectu� dans la classe Search.js pour l'exploiter dans la classe Combobox.js mais le r�sultat revient en "undefined"...
D'autre part, il semblerait que les async/await sont ignor�s du c�t� de Combobox.js, les await sont soulign�s dans le code qui me dit 'await has no effect on the type of this expression'.
J'ai essay� de mettre les fonctions dans le bon ordre d'�x�cution dans le init(), �a ne change rien...
Je signale que le fetch retourne bien les r�sultats escompt�s depuis Search.js
Merci d'avance pour toute aide
Search.js :
Combobox.js :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 export class Search { /** * @param { String } url Spécifie l'url requise (controller) * @param {string} method Spécifie la méthode GET ou POST * @param { String } searchInputId Spécifie l'id du champ de recherche ciblé * @param { String } resultsFieldId Spécifie l'id du champ d'affichage des résultats * @param {boolean} createList (false par défaut) Spécifie si le résultat doit être présenté en tant que liste dans le champ de résultats */ constructor(url, method, searchInputId, resultsFieldId, createList = false) { this.url = url; this.method = method; this.searchInputId = searchInputId; this.resultsFieldId = resultsFieldId; this.resultsFieldId = document.querySelector(`#${this.resultsFieldId}`); this.searchInputId = document.querySelector(`#${this.searchInputId}`); this.createList = createList; } fetchData() { let data; let response = ""; let timeout = null; const formData = new FormData(); this.searchInputId.addEventListener("keyup", (e) => { e.preventDefault(); let recherche = this.searchInputId.value; if (recherche.length > 0) { if (timeout !== null) { clearTimeout(timeout); } timeout = setTimeout(() => { rechercher(formData, recherche); }, 1000); } }); const rechercher = async (formData, recherche) => { try { if (this.method === "POST") { formData.append("recherche", recherche); response = await fetch(this.url, { method: this.method, headers: { Accept: "application/json", "X-Requested-with": "XMLHttpRequest", }, body: formData, }); } else { response = await fetch(`${this.url}${recherche}`, { method: this.method, headers: { Accept: "application/json", "X-Requested-with": "XMLHttpRequest", }, }); } if (response.ok) { data = await response.json(); this.resultsFieldId.innerHTML = ""; if (data || data.content !== "") { if (this.createList) { //Crée une liste de valeurs pour autocomplete const ul = document.createElement("ul"); data.map((el) => { let li = document.createElement("li"); li.textContent = el.nom + " " + el.prenom; ul.append(li); }); this.resultsFieldId.append(ul); // } else { //Affiche simplement le résultat dans le champ en fragment HTML this.resultsFieldId.insertAdjacentHTML( "afterbegin", data.content ); } } else { this.resultsFieldId.innerHTML = `<p class="alert">Aucun résultat trouvé avec ces termes : "${this.searchInputId.value}"</p>`; } console.log("data depuis classe Search.js = ", data); return data; } } catch (error) { console.log(error); } }; } }
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 import { Search } from "./Search.js"; export class Combobox extends Search { /** * @param {string} wrapperDiv Id de la Div recevant le combobox * @param {string} comboboxLabel titre du label du combobox */ constructor(wrapperDiv, comboboxLabel, url, method) { super(url, method); this.comboboxLabel = comboboxLabel; this.wrapperDiv = document.querySelector(`#${wrapperDiv}`); //Initialisation des fonctions dans l'ordre this.init(); } init() { this.createCombobox(); } createCombobox() { //Création du combobox de recherche //Création du label de combobox this.labelCombobox = document.createElement("span"); this.labelCombobox.className = "combobox-label"; this.labelCombobox.textContent = this.comboboxLabel; this.combobox = document.createElement("div"); this.combobox.className = "combobox-content"; this.combobox.id = "combobox"; //label du champ de recherche const labelSearchInput = document.createElement("label"); labelSearchInput.htmlFor = "search-input"; labelSearchInput.innerText = "Rechercher"; //création du champ input de recherche const searchInput = document.createElement("input"); searchInput.type = "search"; searchInput.className = "form__input search-input"; searchInput.id = "combobox-search-input"; this.searchInputId = searchInput.id; console.log(this.searchInputId); //Création de la liste de résultats autocomplete const searchResultsList = document.createElement("div"); searchResultsList.className = "search-results-list"; searchResultsList.id = "search-results-list"; this.searchResultsListId = searchResultsList.id; //section liste des éléments sélectionnés const selectedItemsList = document.createElement("div"); selectedItemsList.className = "selected-items-list"; selectedItemsList.id = "selected-items-list"; //Application des champs dans le wrapper "combobox" this.combobox.append( labelSearchInput, searchInput, searchResultsList, selectedItemsList ); //Création du combobox dans la div renseignée this.wrapperDiv.append(this.labelCombobox, this.combobox); this.searchItems(); } //lancement de la requête fetch dans la classe Search.js async searchItems() { let search = await new Search( this.url, this.method, this.searchInputId, this.searchResultsListId, true ); let results = await search.fetchData(); console.log("data depuis la classe Combobox.js = ", results); return results; } }
Partager