0Pricing
C# Academy · Pelajaran

Pengikatan Data & Penanganan Peristiwa

Terapkan pengikatan data satu arah dan dua arah, tangani peristiwa DOM serta komponen, dan gunakan EventCallback.

Pengikatan Data & Penanganan Peristiwa adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Pengikatan di Blazor

Blazor mendukung tiga arah pengikatan: satu arah (hanya baca, @expr), berbasis peristiwa (@onclick dan lainnya), serta dua arah (@bind). Ketiganya membentuk fondasi antarmuka pengguna reaktif.

Pengikatan Data Satu Arah

Tampilkan ekspresi C# di dalam markah menggunakan @. Nilainya diperbarui setiap kali komponen dirender ulang, tetapi DOM tidak dapat mengirim nilai kembali ke C#.

<!-- One-way: C# -> DOM -->
<p>Count: @_count</p>
<p>Full name: @($"{_firstName} {_lastName}")</p>
<p>Price: @Price.ToString("C")</p>

@code {
    private int _count = 0;
    private string _firstName = "Alice";
    private string _lastName = "Smith";
    [Parameter] public decimal Price { get; set; }
}

Pengikatan Dua Arah dengan @bind

@bind menghubungkan elemen masukan ke suatu bidang menggunakan pengaturan properti dan peristiwa perubahan. Fitur ini berfungsi pada teks, angka, tanggal, kotak centang, dan daftar pilihan.

<input @bind="_name" placeholder="Enter name" />
<input type="number" @bind="_quantity" />
<input type="date" @bind="_dueDate" />
<input type="checkbox" @bind="_isActive" />

<p>Name: @_name | Qty: @_quantity | Active: @_isActive</p>

@code {
    private string _name = "";
    private int _quantity = 1;
    private DateTime _dueDate = DateTime.Today;
    private bool _isActive = true;
}

@bind dengan Peristiwa Kustom

Secara bawaan, @bind menggunakan peristiwa onchange. Gunakan @bind:event untuk mengubahnya—misalnya, oninput dipicu pada setiap penekanan tombol untuk pencarian langsung.

@* Updates on every keystroke instead of on focus-loss *@
<input @bind="_search"
       @bind:event="oninput"
       placeholder="Live search..." />

<ul>
    @foreach (var item in Filtered)
    {
        <li>@item</li>
    }
</ul>

@code {
    private string _search = "";
    private string[] Items = { "Apple", "Banana", "Cherry", "Avocado" };
    private IEnumerable<string> Filtered =>
        Items.Where(i => i.Contains(_search, StringComparison.OrdinalIgnoreCase));
}

Penanganan Peristiwa dengan @onclick

Gunakan @onclick (dan direktif peristiwa DOM lainnya) untuk memasang delegasi C# ke peristiwa DOM. Metode sinkron dan tugas async dapat digunakan.

<button @onclick="Increment">+</button>
<button @onclick="DecrementAsync">-</button>
<button @onclick="() => _count = 0">Reset</button>
<p>Count: @_count</p>

@code {
    private int _count = 0;

    private void Increment() => _count++;

    private async Task DecrementAsync()
    {
        await Task.Delay(200); // simulate async work
        _count--;
    }
}

Argumen Peristiwa

Peristiwa DOM menyediakan objek argumen peristiwa. Deklarasikan jenis argumen yang sesuai dalam penangan Anda untuk mengakses koordinat, kode tombol, nilai masukan, dan sebagainya.

<input @onkeydown="OnKeyDown" @onfocus="OnFocus" />
<div @onmousemove="OnMouseMove">Move here</div>
<p>@_info</p>

@code {
    private string _info = "";

    private void OnKeyDown(KeyboardEventArgs e)
        => _info = $"Key: {e.Key} (Ctrl={e.CtrlKey})";

    private void OnFocus(FocusEventArgs e)
        => _info = "Input focused";

    private void OnMouseMove(MouseEventArgs e)
        => _info = $"Mouse: ({e.ClientX}, {e.ClientY})";
}

EventCallback untuk Komunikasi Induk-Anak

EventCallback adalah cara Blazor untuk komunikasi anak-ke-induk. Tidak seperti Action/Func biasa, fitur ini otomatis memicu StateHasChanged pada induk dan menangani pengecualian dengan benar.

@* Child: ProductCard.razor *@
<button @onclick="() => OnBuy.InvokeAsync(Product)">Buy</button>

@code {
    [Parameter] public Product Product { get; set; } = default!;
    [Parameter] public EventCallback<Product> OnBuy { get; set; }
}

@* Parent: *@
<ProductCard Product="p" OnBuy="HandleBuy" />

@code {
    private async Task HandleBuy(Product p)
    {
        await CartService.AddAsync(p);
        // Parent re-renders automatically
    }
}

Mencegah Tindakan Bawaan dan Menghentikan Propagasi

Gunakan @onclick:preventDefault untuk membatalkan tindakan bawaan peramban, dan @onclick:stopPropagation untuk menghentikan penyebaran peristiwa.

@* Prevent form submission *@
<form @onsubmit="HandleSubmit" @onsubmit:preventDefault>
    <input @bind="_value" />
    <button type="submit">Save</button>
</form>

@* Stop click from bubbling to parent div *@
<div @onclick="ParentClicked">
    <button @onclick="ChildClicked"
            @onclick:stopPropagation>
        Click me
    </button>
</div>

Pengikatan Dua Arah dengan @bind-Value pada Komponen Kustom

Terapkan pola Value/ValueChanged pada komponen kustom untuk mendukung @bind-Value dari induk—kontrak pengikatan dua arah standar Blazor.

@* RatingInput.razor *@
@for (int i = 1; i <= 5; i++)
{
    int star = i;
    <span class="@(star <= Value ? "filled" : "")"
          @onclick="() => ValueChanged.InvokeAsync(star)">★</span>
}

@code {
    [Parameter] public int Value { get; set; }
    [Parameter] public EventCallback<int> ValueChanged { get; set; }
}

@* Usage: *@
<RatingInput @bind-Value="_rating" />

Menunda Peristiwa Masukan

Untuk operasi mahal yang dipicu oleh masukan pengguna (panggilan API, pemfilteran berat), tunda peristiwa menggunakan CancellationTokenSource agar eksekusi tertunda sampai pengguna berhenti mengetik.

@code {
    private string _query = "";
    private CancellationTokenSource? _cts;

    private async Task OnSearchInput(ChangeEventArgs e)
    {
        _query = e.Value?.ToString() ?? "";
        _cts?.Cancel();
        _cts = new CancellationTokenSource();

        try
        {
            await Task.Delay(300, _cts.Token); // wait 300ms
            Results = await SearchService.SearchAsync(_query);
        }
        catch (TaskCanceledException) { /* user still typing */ }
    }

    private List<string> Results = new();
}

Pemeriksaan Singkat

Apa keunggulan EventCallback dibandingkan aksi/fungsi untuk peristiwa anak-ke-induk di Blazor?

Ringkasan: Pengikatan Data dan Penanganan Peristiwa

Poin penting:

  • Pengikatan satu arah: tampilkan ekspresi C# dengan @expr
  • Pengikatan dua arah: gunakan @bind pada masukan; @bind:event mengubah pemicunya
  • Peristiwa DOM: @onclick, @oninput, @onkeydown dengan argumen peristiwa bertipe
  • EventCallback<T>: komunikasi anak-ke-induk dengan pemanggilan StateHasChanged otomatis
  • Implementasikan Value/ValueChanged untuk pengikatan dua arah pada komponen kustom
  • Tunda operasi mahal untuk mengurangi panggilan API yang tidak diperlukan

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengikatan Data & Penanganan Peristiwa” gratis?

Ya — teks lengkap “Pengikatan Data & Penanganan Peristiwa” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pengikatan Data & Penanganan Peristiwa”?

Terapkan pengikatan data satu arah dan dua arah, tangani peristiwa DOM serta komponen, dan gunakan EventCallback. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Pengikatan Data & Penanganan Peristiwa” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model Komponen Blazor
  2. Pengikatan Data & Penanganan Peristiwa
  3. Komunikasi Komponen & DI
  4. Pengelolaan Status di Blazor
← Kembali ke C# Academy