Home / راهنماها / یکپارچه سازی فرم تماس زاویه ای (مستقل و سیگنال ها)
راهنمای ادغام · ANGULAR & SPA

یکپارچه سازی فرم تماس زاویه ای (مستقل و سیگنال ها)

برنامه‌های Angular 17/18+ را با استفاده از مؤلفه‌های مستقل، سیگنال‌های واکنشی و HttpClient به Lugatu متصل کنید تا فرم تماس قابل‌اطمینانی تحویل داده شود، بدون اینکه سرور SMTP نگهداری شود.

1. جزء فرم تماس مستقل با سیگنال های واکنشی

مدرن انگولار کامپوننت ها و سیگنال های مستقل را نسبت به NgModules های سنگین ترجیح می دهد. این پیاده سازی یک فرم تماس قابل دسترسی با بارگیری واکنشی، خطا و وضعیت های موفقیت ارائه می دهد که مستقیماً به 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

اگر برنامه Angular شما با Angular SSR (موتور گره / اکسپرس) اجرا می‌شود، می‌توانید درخواست‌های پراکسی را از طریق یک کنترلر مسیر سمت سرور انجام دهید تا از کلید API سرور به سرور Lugatu خود محافظت کنید.

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. Bot Defense & Honeypot Configuration

لوگاتو فیلد _gotcha را به طور خودکار بررسی می کند. با استفاده از display:none و tabindex="-1" آن را برای بازدیدکنندگان انسانی نامرئی نگه دارید. هرزنامه‌هایی که هر ورودی DOM را پر می‌کنند، باعث سرکوب بی‌صدا می‌شوند.

tip

هرگز از برچسب های فرم برای ورودی هانی پات استفاده نکنید. تکمیل خودکار را غیرفعال کنید و فیلد را از نام‌های قابل دسترسی صفحه‌خوان حذف کنید.

امنیت و احراز هویت ثابت

امنیت ثابت: کلیدهای API سرور به سرور (lug_live_...) هرگز نباید در دارایی های Angular سمت کلاینت یا فایل های محیطی محیطی قرار گیرند. از نقطه پایانی عمومی برای ارسال مستقیم مشتری یا ارسال از طریق نقاط پایانی سرور استفاده کنید.

عیب یابی و خطاهای رایج بلع

HTTP 403 FORBIDDEN_BROWSER_ORIGIN هنگام ارسال از Angular

نقاط پایانی فرم عمومی اجازه ارسال با مبدا متقابل را از هر مرورگری می‌دهد. اگر مستقیماً از Angular با نقطه پایانی سرور به سرور (POST /api/v1/forms/{id}/submissions) تماس می‌گیرید، به نقطه پایانی عمومی (POST /api/v1/public/forms/{id}/submissions) بروید یا از طریق یک Backend ارسال کنید.

سوالات متداول

آیا Lugatu از Angular SSR با هیدراتاسیون مشتری پشتیبانی می کند؟

بله. ارسال فرم های عمومی Lugatu از طریق واکشی سمت مشتری یا HttpClient پس از تعامل کاربر انجام می شود که کاملاً با Angular SSR و هیدراتاسیون مشتری سازگار است.

برای ایجاد نقطه پایانی فرم خود آماده هستید؟

در عرض چند ثانیه به صورت رایگان شروع کنید. بدون نیاز به کارت اعتباری

رایگان شروع کنید →