Kulmakontaktilomakkeen integrointi (erillinen ja signaalit)
Yhdistä Angular 17/18+ -sovellukset Lugatuun itsenäisillä komponenteilla, reaktiivisilla signaaleilla ja HttpClientillä varmistaaksesi yhteydenottolomakkeen luotettavan toimituksen ilman SMTP-palvelinta.
1. Erillinen kontaktilomakekomponentti reaktiivisilla signaaleilla
Modern Angular suosii itsenäisiä komponentteja ja signaaleja raskaiden NgModulien sijaan. Tämä toteutus tarjoaa käytettävissä olevan yhteydenottolomakkeen, jossa reaktiiviset lataus-, virhe- ja onnistumistilat lähetetään suoraan Lugatuun.
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-välitys
Jos Angular-sovelluksesi toimii Angular SSR:n (Node / Express engine) kanssa, voit suojata Lugatu Server-to-Server API-avaimesi välityskyselyillä palvelinpuolen reitinkäsittelijän kautta.
// 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. Bot Defense & Honeypot -kokoonpano
Lugatu tarkastaa _gotcha-kentän automaattisesti. Pidä se näkymättömänä ihmisvieraille käyttämällä display:none ja tabindex="-1". Roskapostit, jotka täyttävät jokaisen DOM-syötteen, laukaisevat hiljaisen tukahdutuksen.
Älä koskaan käytä lomaketarroja hunajakakkujen syöttämiseen. Jätä automaattinen täydennys pois päältä ja sulje kenttä pois näytönlukuohjelman käytettävissä olevista nimistä.
Security & Authentication Invariant
Suojausmuuttumaton: Palvelinten välisiä API-avaimia (lug_live_...) ei saa koskaan niputtaa asiakaspuolen Angular-varas- tai Environment.ts-tiedostoihin. Käytä julkista päätepistettä suoriin asiakaslähetyksiin tai lähetä edelleen palvelimen päätepisteiden kautta.
Vianetsintä ja yleiset nielemisvirheet
Julkisen lomakkeen päätepisteet sallivat eri lähteiden lähettämisen mistä tahansa selaimesta. Jos kutsut palvelinten välistä päätepistettä (POST /api/v1/forms/{id}/submissions) suoraan Angularista, vaihda julkiseen päätepisteeseen (POST /api/v1/public/forms/{id}/submissions) tai jatka taustajärjestelmän kautta.
Usein kysytyt kysymykset
Tukeeko Lugatu Angular SSR:ää asiakkaan nesteytyksellä?
Kyllä. Lugatu julkisten lomakkeiden lähetykset suoritetaan asiakaspuolen haulla tai HttpClientillä käyttäjän vuorovaikutuksen jälkeen, mikä on täysin yhteensopiva Angular SSR:n ja asiakkaan hydratoinnin kanssa.
Oletko valmis luomaan lomakkeen päätepisteen?
Aloita ilmaiseksi sekunneissa. Luottokorttia ei vaadita.