Home / Vejledninger / Integration af vinklet kontaktformular (standalone og signaler)
INTEGRATIONSGUIDE · ANGULAR & SPA

Integration af vinklet kontaktformular (standalone og signaler)

Forbind Angular 17/18+-applikationer til Lugatu ved hjælp af Standalone-komponenter, reaktive signaler og HttpClient for pålidelig levering af kontaktformularer uden at vedligeholde en SMTP-server.

1. Standalone kontaktformularkomponent med reaktive signaler

Modern Angular foretrækker selvstændige komponenter og signaler frem for tunge NgModules. Denne implementering giver en tilgængelig kontaktformular med reaktiv indlæsning, fejl og succestilstande, der sendes direkte til 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-videresendelse

Hvis din Angular-applikation kører med Angular SSR (Node / Express-motor), kan du proxy-forespørgsler gennem en server-side-rutehandler for at beskytte din Lugatu Server-to-Server API-nøgle.

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. Botforsvar & Honeypot-konfiguration

Lugatu inspicerer _gotcha-feltet automatisk. Hold det usynligt for menneskelige besøgende ved hjælp af display:none og tabindex="-1". Spambots, der fylder hvert DOM-input, udløser tavs undertrykkelse.

tip

Brug aldrig formularetiketter til honeypot-indgange. Lad autofuldførelse være slået fra, og udelad feltet fra skærmlæser tilgængelige navne.

Sikkerhed & Autentificering Invariant

Sikkerhedsinvariant: Server-til-server API-nøgler (lug_live_...) må aldrig samles i Angular-aktiver på klientsiden eller environment.ts-filer. Brug det offentlige slutpunkt til direkte klientindsendelser eller videresend via serverendepunkter.

Fejlfinding og almindelige indtagelsesfejl

HTTP 403 FORBIDDEN_BROWSER_ORIGIN ved indsendelse fra Angular

Offentlige slutpunkter tillader indsendelser med krydsoprindelse fra enhver browser. Hvis du kalder server-til-server-slutpunktet (POST /api/v1/forms/{id}/submissions) direkte fra Angular, skal du skifte til det offentlige slutpunkt (POST /api/v1/public/forms/{id}/submissions) eller videresende gennem en backend.

Ofte stillede spørgsmål

Understøtter Lugatu Angular SSR med klienthydrering?

Ja. Lugatu offentlige formularindsendelser udføres via klientsiden hentning eller HttpClient efter brugerinteraktion, som er fuldstændig kompatibel med Angular SSR og klienthydrering.

Klar til at oprette dit formularslutpunkt?

Kom i gang gratis på få sekunder. Intet kreditkort påkrævet.

Start gratis →