Home / Pemandu / Penyepaduan Borang Hubungan Sudut (Standalone & Isyarat)
PANDUAN INTEGRASI · ANGULAR & SPA

Penyepaduan Borang Hubungan Sudut (Standalone & Isyarat)

Sambungkan aplikasi Angular 17/18+ ke Lugatu menggunakan Komponen Kendiri, Isyarat reaktif dan HttpClient untuk penghantaran borang hubungan yang boleh dipercayai tanpa mengekalkan pelayan SMTP.

1. Komponen Borang Hubungan Kendiri dengan Isyarat Reaktif

Sudut Moden mengutamakan Komponen dan Isyarat Kendiri berbanding NgModul yang berat. Pelaksanaan ini menyediakan borang hubungan yang boleh diakses dengan pemuatan reaktif, ralat dan keadaan kejayaan yang diserahkan terus kepada Lugatu.

contact-form.component.ts typescript
import { Component, signal, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-contact-form',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <form (ngSubmit)="onSubmit()" class="space-y-4 max-w-md">
      <div>
        <label for="name" class="block text-sm font-semibold mb-1">Your Name</label>
        <input id="name" type="text" [(ngModel)]="name" name="name" required class="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label for="email" class="block text-sm font-semibold mb-1">Email Address</label>
        <input id="email" type="email" [(ngModel)]="email" name="email" required class="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label for="message" class="block text-sm font-semibold mb-1">Message</label>
        <textarea id="message" rows="4" [(ngModel)]="message" name="message" required class="w-full border rounded-xl p-2.5"></textarea>
      </div>

      <!-- Honeypot spam defense -->
      <input type="text" [(ngModel)]="gotcha" name="_gotcha" style="display:none !important" tabindex="-1" autocomplete="off" />

      <button type="submit" [disabled]="isSubmitting()" class="btn-primary-editorial py-2.5 px-6">
        {{ isSubmitting() ? 'Sending...' : 'Send Message' }}
      </button>

      <p *ngIf="isSuccess()" class="text-sm text-green-700 font-medium">Thank you! Your message has been received.</p>
      <p *ngIf="errorMessage()" class="text-sm text-red-600">{{ errorMessage() }}</p>
    </form>
  `,
})
export class ContactFormComponent {
  private http = inject(HttpClient);

  name = signal('');
  email = signal('');
  message = signal('');
  gotcha = signal('');

  isSubmitting = signal(false);
  isSuccess = signal(false);
  errorMessage = signal('');

  onSubmit() {
    if (this.gotcha()) return; // Silent discard for automated bot submissions

    this.isSubmitting.set(true);
    this.errorMessage.set('');

    const payload = {
      fields: {
        name: this.name(),
        email: this.email(),
        message: this.message(),
      },
      honeypot: this.gotcha(),
    };

    this.http.post('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', payload)
      .subscribe({
        next: () => {
          this.isSubmitting.set(false);
          this.isSuccess.set(true);
          this.name.set('');
          this.email.set('');
          this.message.set('');
        },
        error: () => {
          this.isSubmitting.set(false);
          this.errorMessage.set('Submission failed. Please try again.');
        },
      });
  }
}

2. SSR & Angular Universal Server-to-Server Forwarding

Jika aplikasi Angular anda berjalan dengan Angular SSR (enjin Nod / Express), anda boleh membuat proksi pertanyaan melalui pengendali laluan sebelah pelayan untuk melindungi kunci API Lugatu Server-to-Server anda.

server.ts typescript
// Express / Node backend endpoint in Angular SSR
server.post('/api/contact', async (req, res) => {
  const { name, email, message, _gotcha } = req.body;
  if (_gotcha) return res.status(200).json({ ok: true });

  try {
    const response = await fetch(`https://www.lugatu.com/api/v1/forms/${process.env.LUGATU_FORM_ID}/submissions`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.LUGATU_API_KEY}`,
        'Content-Type': 'application/json',
        'Idempotency-Key': crypto.randomUUID(),
      },
      body: JSON.stringify({ fields: { name, email, message } }),
    });

    res.status(response.status).json({ ok: response.ok });
  } catch (error) {
    res.status(500).json({ error: 'Failed to deliver message' });
  }
});

3. Pertahanan Bot & Konfigurasi Honeypot

Lugatu memeriksa medan _gotcha secara automatik. Pastikan ia tidak kelihatan kepada pelawat manusia menggunakan display:none dan tabindex="-1". Spambot yang mengisi setiap input DOM mencetuskan penindasan senyap.

tip

Jangan sekali-kali menggunakan label borang untuk input honeypot. Biarkan autolengkap dimatikan dan kecualikan medan daripada nama yang boleh diakses oleh pembaca skrin.

Keselamatan & Pengesahan Invarian

Invarian Keselamatan: Kunci API pelayan-ke-pelayan (lug_live_...) tidak boleh digabungkan ke dalam aset Sudut sisi klien atau fail environment.ts. Gunakan titik akhir awam untuk penyerahan pelanggan langsung atau ke hadapan melalui titik akhir pelayan.

Menyelesaikan masalah & Ralat Pengingesan Biasa

HTTP 403 FORBIDDEN_BROWSER_ORIGIN apabila menyerahkan daripada Angular

Titik akhir borang awam membenarkan penyerahan silang asal daripada mana-mana penyemak imbas. Jika anda memanggil titik akhir pelayan-ke-pelayan (POST /api/v1/forms/{id}/submissions) terus dari Angular, tukar ke titik akhir awam (POST /api/v1/public/forms/{id}/submissions) atau ke hadapan melalui hujung belakang.

Soalan Lazim

Adakah Lugatu menyokong Angular SSR dengan penghidratan pelanggan?

ya. Penyerahan borang awam Lugatu dilakukan melalui pengambilan sisi klien atau HttpClient selepas interaksi pengguna, yang serasi sepenuhnya dengan Angular SSR dan penghidratan pelanggan.

Bersedia untuk membuat titik akhir borang anda?

Bermula secara percuma dalam beberapa saat. Tiada kad kredit diperlukan.

Mula Percuma →