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.
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.
// 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.
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
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.