Tahun baru, skill baru! 🚀. Masukkan kupon "skill2025" untuk diskon 30% di kelas apa saja

gagal fetch web API

gan mau nanya ini saya tuh lagi bikin aplikasi web pencari resep makanan.

ini kenapa yah saya gagal fetch API mulu?padahal udh di cek berkali-kali masih tetep gk ke ambil datanya.mohon koreksinya klo ada yg salah soalnya masih newbie..

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>Delicious Meal</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <nav-bar></nav-bar>
        <meal-list></meal-list>
        <script src="./src/component/header.js"></script>
        <script src="./src/component/meal-list.js"></script>
        <script src="./src/component/meal-item.js"></script>
        <script src="./src/script/data/SearchData.js"></script>
        <script src="./src/main.js"></script>
        <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
    </body>
</html>

header.js

class Navbar extends HTMLElement {
    connectedCallback(){
        this.render();
    }

    set clickEvent(event){
        this._clickEvent = event;
        this.render();
    }

    get value(){
        return this.querySelector("#searchItems").value;
    }

    render(){
        this.innerHTML = `
        <nav class="navbar navbar-light bg-primary">
            <a class="navbar-brand">Delicious Meal</a>
            <form class="form-inline">
                <input class="form-control mr-sm-2" type="search" placeholder="Cari Resep Makanan" aria-label="Search" id="searchItems">
                <button class="btn btn-outline-success my-2 my-sm-0" id="buttonSearch" type="submit">Cari</button>
            </form>
        </nav>
        `;
        this.querySelector("#buttonSearch").addEventListener("click",this._clickEvent);
    }
}

customElements.define("nav-bar",Navbar);

meal-list.js

class MealList extends HTMLElement{
    set meals(meals){
        this._meals = meals;
        this.render();
    }

    renderError(message){
        this.innerHTML += `
            <h2>${message}</h2>
        `;
    }

    render(){
        this.innerHTML = "";
        this._meals.forEach(meal => {
            const mealItem = document.createElement("meal-item");
            mealItem.meal = meal;
            this.appendChild(mealItem);
        });
    }
}

customElements.define("meal-list",MealList);

meal-item.js

class MealItem extends HTMLElement{
    set meals(meal){
        this._meal = meal;
        this.render();
    }

    render(){
        this.innerHTML = `
        <div class=meal-item>
            <img src=${this._meal.strMealThumb} alt="">
            <h3>${this._meal.strMeal}</h3>
            <p>Alat dan Bahan</p>
            <ul>
                <li>${this._meal.strIngredients}</li>
            </ul>
            <p>Langkah-langkah</p>
            <ul>
                <li>${this._meal.strInstructions}</li>
            </ul>
        </div>
        `;
    }
}

customElements.define("meal-item",MealItem);

SearchData.js

class SearchData{
    static SearchMeal(keyword){
        return fetch(`https://www.themealdb.com/api/json/v1/1/search.php?s=${keyword}`)
        .then(res =>{
            return res.json();
        })
        .then(resJson =>{
            if(resJson.meals){
                return Promise.resolve(console.log(resJson.meals));
            }
            else{
                return Promise.reject(console.log(`${keyword} tidak ditemukan`));
            }
        });
    }
}

main.js

const main = () =>{
    const searchMealElement = document.querySelector("nav-bar");
    const mealList = document.querySelector("meal-list");

    const searchClicked = () =>{
        SearchData.SearchMeal(searchMealElement.value)
            .then(successResult)
            .catch(failResult)
    }

    const successResult = result => {
        mealList.meals = result;
    }

    const failResult = message => {
        mealList.renderError(message);
    }

    searchMealElement.clickEvent = searchClicked;
};

app.js

document.addEventListener("DOMContentLoaded",main);
avatar nogi
@nogi

21 Kontribusi 2 Poin

Diperbarui 4 tahun yang lalu

Tanggapan

Ada pesan error di konsolnya?

gk ada gan

1 Jawaban:

Jawaban Terpilih

<div>file: index.html<br>app.js tidak ada dibawah main.js di-html-nya.<br><br>file: header.js<br>button (id:buttonSearch) ganti type-nya jadi button.<br>kalau type submit, page akan reload.<br><br>file: meal-list.js<br>code dalam forEach; property meal itu harusnya meals (karena di compoenent meal-item tidak ada property meal).<br><br>file: SearchData.js<br>console.log itu tidak ada return value.&nbsp;<br>Hapus console.log-nya di Promise.resolve dan Promise.reject .</div>

avatar soeleman
@soeleman

120 Kontribusi 147 Poin

Dipost 4 tahun yang lalu

Tanggapan

makasih gan

Login untuk ikut Jawaban