Berichtsdesigner
Erstellen Sie visuelle Berichts- und Dokumentlayouts, die Ihr Backend beim Rendern mit Daten füllt.
PageKit — der selbst gehostete GrapesJS-Website-Builder, als Quellcode. Early Access sichern
Baue einen visuellen Drag-and-Drop-Seiten-Builder für Angular mit wiederverwendbaren Blöcken, Komponenten, Vorlagen, responsiver Bearbeitung und deinem eigenen Veröffentlichungsworkflow.
26k+
GitHub-Sterne
1.4M+
npm-Downloads / Monat
100+
Plugins auf GJS.Market
$0
Lizenzgebühr, immer
Drei echte GrapesJS-Editoren, die nur geladen werden, wenn man danach fragt. Keine dieser Demos ist eine Angular-Anwendung – und genau das ist der Punkt. GrapesJS rendert in ein Container-Element, das es besitzt, sodass die Bearbeitungsfläche genauso aussieht und sich auch verhält, egal welches Framework die Seite darum herum hostet.
Der Standard-Editor: Leinwand, Blöcke, Layer-Baum, Style-Manager und Geräte-Switcher. Das ist das Fundament, von dem aus du startest, bevor du einen eigenen Block hinzufügst.
Lädt einen Live-Editor von Drittanbietern aus grapesjs.com.
Einen Page Builder zu bauen erfordert weit mehr als nur ein paar Angular-Komponenten. Ein produktionsbereiter visueller Editor benötigt all diese Komponenten, bevor jemand eine Seite damit ausliefern kann:
GrapesJS bietet die visuelle Bearbeitungsgrundlage für den Großteil dieser Liste, sodass Ihre Angular-Anwendung ihr Budget stattdessen für Ihr Produkt und Ihre Geschäftslogik ausgeben kann. Die letzten beiden – wo Projekte gespeichert werden und wie Seiten live werden – bleiben bei dir, weil sie die Teile sind, die zu deiner Infrastruktur passen müssen.
GrapesJS Core ist Open Source unter der BSD-3-Clause-Lizenz, Version 0.23.6, ohne Lizenzgebühr in irgendeinem Maßstab.
Entdecken Sie GrapesJSDie gleiche Engine zeigte auf sechs verschiedene Produkte. Was sich zwischen ihnen ändert, ist dein Content-Modell, deine Blöcke und dein Veröffentlichungsziel – nicht der Editor.
Lass Content-Teams Seiten visuell in deinem CMS bearbeiten, anstatt ein Formular auszufüllen und zu hoffen, dass das Layout erhalten bleibt.
Headless CMS-EditorGib dem Marketing einen visuellen Editor für Kampagnenseiten, damit eine neue Landingpage kein Entwicklerticket mehr ist.
Landingpage-BuilderLassen Sie Benutzer eigene Formulare aus Ihren eigenen Feldkomponenten zusammenstellen, mit Validierungsregeln, die Ihre Anwendung bereits versteht.
Formular-KomponentenErstellen und verwalten Sie E-Mail-Vorlagen visuell, wobei die tabellenbasierten Markup-E-Mail-Clients weiterhin benötigen.
E-Mail-Vorlagen-BuilderErstellen Sie visuelle Berichts- und Dokumentlayouts, die Ihr Backend beim Rendern mit Daten füllt.
Gib jedem Kunden eine eigene markenbasierte Bearbeitungsumgebung, die wie ein Teil deines Produkts aussieht und nicht wie ein angestecktes Werkzeug.
White-Label-SeitengeneratorDer Editor ist eine Möglichkeit innerhalb deiner Anwendung, kein Ersatz dafür. Alles oberhalb der Bearbeitungsebene bleibt genau dort, wo die Angular-Teams es bereits platziert haben.
Alles, was Ihr Produkt zu Ihrem macht, bleibt unverändert.
Eine lazy-loaded Route, eine Komponente, die den Container besitzt, und ein Service, der die Editor-Instanz besitzt.
Die visuelle Bearbeitungs-Engine, die innerhalb des Containers läuft, den deine Komponente bereitstellt.
Wo Projektdaten, Uploads und veröffentlichte Ausgaben tatsächlich gespeichert sind.
Angular besitzt deine Anwendung. GrapesJS treibt die visuelle Bearbeitungsebene an.
Nichts im oberen oder unteren Bereich wird vom Editor bereitgestellt. Diese Grenze hält die Integration flach genug, um später entfernt zu werden – der Editor wird nie zu dem, worum dein Produkt aufgebaut ist.
Lies die Angular-IntegrationsanleitungAcht Subsysteme, die mit dem Motor geliefert werden. Jedes ist ein API, das du konfigurierst, nicht eine Blackbox, die du so annimmst.
Nutzer erstellen Seiten, indem sie Komponenten auf die Leinwand ziehen, neu ordnen und dort verschachteln, wo es erlaubt ist.
Definiere wiederverwendbare Komponententypen mit ihrem eigenen traits, Regeln darüber, was in sie fallen darf, und dein eigenes Verhalten.
Gib den Nutzern vordefinierte Abschnitte und Layouts in einer Palette statt einer Liste von rohen HTML-Elementen.
Lassen Sie Benutzer Typografie, Abstand, Farbe und Layout über von Ihnen gewählte und einschränkende Eigentumsfelder anpassen.
Vorschau und style eine Seite pro Breakpoint neu, wobei du die von dir definierten Gerätebreiten und nicht ein festes Set nutzt.
Verwalte Bilder und andere Projektassets über einen Asset-Manager, den du auf deinen eigenen Speicher verweisen kannst.
Speichere fertige Seiten als wiederverwendbare Startpunkte, damit die nächste Seite irgendwo anders als leer beginnt.
Hol dir saubere HTML und CSS aus dem Editor oder lies das Projekt JSON und rendere es, wie es deine Anwendung bevorzugt.
Was absichtlich nicht auf dieser Liste steht: Hosting, ein CMS, ein Berechtigungsmodell und eine Veröffentlichungsinfrastruktur. Diese gehören zu deiner Anwendung, und die untenstehenden Abschnitte zeigen, wie sie verbunden sind.
Ein generischer Website-Builder ist selten das Produkt, das jemand möchte. Jede Ebene des Editors kann stattdessen durch etwas ersetzt werden, das zu deiner Anwendung passt.
Jede Ebene beschränkt den Editor auf dein Content-Modell. Beim letzten Punkt schreiben Nutzer dein Produkt – nicht eine Website.
Registrieren Sie Komponententypen, die Ihre eigenen Domänenobjekte spiegeln, stellen Sie nur das traits offen, auf das Ihr Backend reagieren kann, und fügen Sie sie in die Blockpalette unter Ihre eigenen Kategorien ein. Nutzer arbeiten dann mit einer Preistabelle oder einem Produktraster, das Ihr API bereits versteht, anstatt mit willkürlichem Markup, das Sie später parsen müssen.
// Your content model, not a generic website element.
editor.Components.addType('pricing-table', {
isComponent: (el) => el.dataset?.gjsType === 'pricing-table',
model: {
defaults: {
tagName: 'section',
droppable: false,
traits: ['plan', 'currency', 'billingPeriod'],
},
},
});
editor.Blocks.add('pricing-table', {
label: 'Pricing',
category: 'Your design system',
content: { type: 'pricing-table' },
});Ein Komponententyp und der Block, der ihn einfügt. Die Eigenschaften werden zu den Feldern, die dein Backend liest.
Der Unterschied zwischen einem Editor, den viele benutzen, und einem, den sie aufgeben, ist meist das, was am ersten Tag in der Palette ist.
Deine Blöcke
Lass die Nutzer nicht von einer leeren Leinwand starten.
Erstelle wiederverwendbare Blöcke und Vorlagen, die zum Designsystem deiner Anwendung passen, sodass jede Seite, die ein Nutzer erstellt, bereits markengerecht und reaktionsschnell ist. GJS.Market liefert Blocksets und Vorlagenmanager, die du installieren kannst, anstatt die ersten fünfzig von Grund auf zu erstellen.
Durchsuchen Sie Blöcke und VorlagenGrapesJS serialisiert ein Projekt an JSON und übergibt es an einen Speicheradapter. Was dieser Adapter macht, liegt ganz bei dir.
Der Editor spricht nie mit deiner Datenbank. Er ruft den Adapter auf, den du registriert hast, und der Adapter ruft den bereits vorhandenen API auf.
editor.Storage.add('angular-backend', {
async load() {
return firstValueFrom(this.http.get(`/api/pages/${this.pageId}`));
},
async store(data) {
return firstValueFrom(this.http.put(`/api/pages/${this.pageId}`, data));
},
});
grapesjs.init({
container,
storageManager: { type: 'angular-backend', autosave: true, stepsBeforeSave: 5 },
});Ein maßgeschneiderter Speicheradapter, der mit deinem API verbunden ist. Hier ist nichts spezifisch für GJS.Market – es ist der dokumentierte Speichervertrag des Editors.
Komponenten, Stile, Seiten und Assets serialisieren sich zu einem JSON-Dokument, das du in jeder Spalte oder Sammlung speichern kannst.
Der Speichermanager kann nach einer konfigurierbaren Anzahl von Änderungen speichern, nicht nur bei einer expliziten Aktion.
Registrieren Sie einen benutzerdefinierten Adapter und routen Sie über Angular's HttpClient, mit eigenen Abfang- und Authentifizierungsheadern.
Da jeder Speicherstand ein Dokument ist, ist das Führen des Verlaufs eine Entscheidung im Backend – der Editor muss nicht wissen, dass es passiert ist.
Exportiere das gerenderte Markup zusammen mit dem Projekt-JSON, wenn dein Lieferpfad eine statische Ausgabe statt eines erneuten Renderings benötigt.
Eine veröffentlichte Seite ist ein separater Datensatz mit eigenem Lebenszyklus. Halte sie getrennt vom Entwurf, auf den der Editor schreibt.
Du bestimmst, wo Projektdaten gespeichert werden.
Authoring und Publishing sind unterschiedliche Probleme mit unterschiedlichen Fehlermodi. Der Editor löst das erste; das zweite bleibt in deiner Infrastruktur, wo dein Caching, deine Berechtigungen und Rollbacks bereits liegen.
Wohin veröffentlichte Ausgaben gelangen können
Schreiben Sie die Ergebnisse zurück in das Inhaltssystem, das Ihre Organisation bereits betreibt.
Poste das Projekt oder das gerenderte Markup auf einen Endpunkt, der Validierung und Berechtigungen besitzt.
Rendere Seiten zum Zeitpunkt der Veröffentlichung in Dateien, sodass die Live-Seite keinen Teil der Laufzeit des Editors enthält.
Speichere, transformieren und bereitstellen Sie die Ausgabe über denselben Pfad, den Ihre Anwendung bereits zur Bereitstellung ihrer Seiten verwendet.
Drücke veröffentlichte Assets und Markup an den Rand, wobei du die Cache-Invalidierung kontrollierst.
Lösen Sie Ihre bestehende Build- oder Deployment-Pipeline aus der Veröffentlichungsaktion aus.
GrapesJS übernimmt das Authoring. Deine Infrastruktur kann das Veröffentlichen übernehmen.
Eine Bereitstellung Ihrer Angular-Anwendung, ein Editor und eine separate Seite für jeden Kunden darin.
Angular SaaS
Org A
Org B
Org C
Nichts davon ist eine GrapesJS-Funktion. Der Editor hat kein Konzept eines Tenants: Er lädt das zugewiesene Projekt und speichert das zurückgegebene Projekt. Tenancy ist etwas, das Ihre Angular-Anwendung und Ihr Backend implementieren – weshalb es auch das Isolationsmodell anpassen kann, das Sie bereits haben.
Entdecken Sie den SaaS Page BuilderNichts am Editor muss so aussehen wie der Editor. Jede Oberfläche, die ein Nutzer berührt, ist konfigurierbar, austauschbar oder entfernbar.
Machen Sie einen visuellen Editor zu einem nativen Teil Ihres Angular-Produkts.
Erkunden Sie den White-Label-Seiten-BuilderDie Kurzfassung, in vier Schritten. Der vollständige Leitfaden – Lebenszyklusdetails, Wrapper, zonenlose Änderungserkennung, Produktionsbedenken – lebt auf eigener Seite und geht viel weiter als das.
Füge den Editor deiner Anwendung hinzu. Es ist ein schlichtes npm-Paket ohne Angular-spezifischen Build-Schritt.
Halte die Editor-Instanz in einem injizierbaren Service, damit die Komponente dünn bleibt und die Instanz einfach zu teilen, mocken und zerlegen ist.
Das Container-Element muss im DOM sein, bevor der Editor erstellt wird, da GrapesJS es sofort misst.
Ruf destroy, wenn die Route links ist. Ohne sie behält der Editor seine DOM-Listener und die nächste Navigation leakt eine Instance.
npm install grapesjsEine Abhängigkeit. Kein Angular-spezifischer Wrapper ist erforderlich.
import { Injectable, NgZone, inject } from '@angular/core';
import grapesjs, { type Editor } from 'grapesjs';
@Injectable({ providedIn: 'root' })
export class PageBuilderService {
private readonly zone = inject(NgZone);
private editor?: Editor;
create(container: HTMLElement): Editor {
// GrapesJS binds its own DOM listeners to the canvas. Creating it outside
// Angular keeps every drag frame from scheduling change detection.
this.editor = this.zone.runOutsideAngular(() =>
grapesjs.init({
container,
height: '100%',
fromElement: false,
storageManager: false,
})
);
return this.editor;
}
destroy(): void {
this.editor?.destroy();
this.editor = undefined;
}
}Der Dienst besitzt die Instanz und ihre Lebensdauer; die Komponente besitzt nur den Container.
import {
AfterViewInit,
Component,
ElementRef,
OnDestroy,
inject,
viewChild,
} from '@angular/core';
import { PageBuilderService } from './page-builder.service';
@Component({
selector: 'app-page-builder',
standalone: true,
template: '<div #canvas class="builder"></div>',
styles: '.builder { height: 100vh; }',
})
export class PageBuilderComponent implements AfterViewInit, OnDestroy {
private readonly builder = inject(PageBuilderService);
private readonly canvas = viewChild.required<ElementRef<HTMLElement>>('canvas');
ngAfterViewInit(): void {
// The container has to be in the DOM first: GrapesJS measures it on init.
this.builder.create(this.canvas().nativeElement);
}
ngOnDestroy(): void {
// Without this the editor keeps its listeners after the route changes.
this.builder.destroy();
}
}Erschaffe, nachdem die Ansicht existiert, zerstöre, wenn sie verschwindet. Dieses Paar ist der Großteil der Integration.
Brauchen Sie den vollständigen Angular-Integrationsleitfaden?
Wrapper-Optionen, zonenlose Änderungserkennung, faul geladene Editor-Routen, Asset-Handling und die Produktions-Checkliste werden dort komplett abgedeckt.
Lesen Sie den Angular-IntegrationsleitfadenGrapesJS sendet eigene Ereignisse, und diese Ereignisse stammen nicht aus Angular. Die Koordination der beiden sind ein paar Zeilen, aber das Überspringen führt zu den beiden Fehlern, die jede Integration zuerst trifft.
editor.on('storage:end:store', () => {
// Editor events fire outside Angular because the editor was created there.
// Re-enter the zone before touching state the template renders.
this.zone.run(() => this.lastSavedAt.set(new Date()));
});Der Wiedereintritt in die Zone in dem einen Handler, der den gerenderten Zustand aktualisiert.
Erstelle den Editor innerhalb von runOutsideAngular, sodass die Canvas-Interaktion nicht bei jedem Frame die Änderungserkennung plant, und tritt dann in die Zone in den wenigen Ereignishandlern ein, die tatsächlich den Status aktualisieren, die deine Vorlage rendert. Bei einer zonenlosen Anwendung aktualisieren dieselben Handler stattdessen die Signale, und der äußere Wrapper wird nicht mehr benötigt.
Mehr zum Angular-Lebenszyklus und ZonenGrapesJS benötigt einen Browser DOM. Bei Angular SSR oder Angular Universal bedeutet das, dass der Editor nur im Browser erstellt wird – die Route um ihn herum wird auf dem Server weiterhin wie gewohnt gerendert.
Bewache die Initialisierung mit isPlatformBrowser und kehre frühzeitig auf dem Server zurück. Der Rest der Route bleibt unverändert: Wachen, Resolver und das umliegende Markup behalten ihr server-rendertes Verhalten, und nur der Editor-Container kommt leer an.
import { PLATFORM_ID, inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
export class PageBuilderComponent implements AfterViewInit {
private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
ngAfterViewInit(): void {
// There is no DOM on the server and GrapesJS needs one, so the editor is
// created in the browser only. The rest of the route still renders on the
// server as usual.
if (!this.isBrowser) return;
this.builder.create(this.canvas().nativeElement);
}
}Die gesamte SSR-Anpassung: eine Plattformkontrolle, bevor der Editor erstellt wird.
Die Integration ist gewöhnlicher Angular-Code, was das Wichtigste ist, das darüber zu sagen.
Der Editor liefert eigene Typdefinitionen, sodass die Instanz, ihre Konfiguration und ihre Ereignisse am Aufrufstandort getippt werden.
Erstellung und Zerlegung hängt von ngAfterViewInit und ngOnDestroy ab – kein manuelles Bootstrapping außerhalb des Komponentenbaums.
Nichts in der Integration hängt von der Laufzeit-Template-Kompilierung ab, daher baut sich die Editor-Route wie jede andere lazy-loaded-Route.
Wo SSR im Spiel ist, ist nur die Editor-Erstellung browser-geschützt; der Rest der Komponente kompiliert und rendert normal.
Jede untenstehende Funktion muss vorhanden sein, bevor ein visueller Editor benutzbar ist. Die einzige Frage ist, welchen du selbst schreibst.
| Leistungsfähigkeit | Von Grund auf | GrapesJS |
|---|---|---|
| Visuelle Leinwand | Selbst bauen | Enthalten |
| Drag & Drop | Selbst bauen | Enthalten |
| Komponenten | Selbst bauen | Enthalten |
| Blöcke | Selbst bauen | Erweiterbar |
| Design | Selbst bauen | Enthalten |
| Responsive Bearbeitung | Selbst bauen | Enthalten |
| Vermögenswerte | Selbst bauen | Erweiterbar |
| Vorlagen | Selbst bauen | Erweiterbar |
| Lagerung | Selbst bauen | Erweiterbar |
| Export | Selbst bauen | Erweiterbar |
| Angular-Integration | Selbst bauen | Integrieren |
"Erweiterbar" bedeutet, dass das Subsystem existiert und ein dokumentiertes API hat, das du auf deine eigene Implementierung verweist – nicht, dass es vorverdrahtet an dein Backend ankommt. Verifiziert mit GrapesJS 0.23.6 auf 2026-09-03.
Baue dein Angular-Produkt. Baue die visuelle Bearbeitungs-Engine nicht neu auf.
Der Stapel, den ein arbeitender Bauunternehmer am Ende bekommt. GrapesJS deckt die erste Schicht ab; der Rest ist bei dir zum Zusammenbauen, Installieren oder Kaufen.
Die Engine bietet dir die Bearbeitungsfläche. Alles, was ein bestimmtes Produkt darüber benötigt – die Blockpalette, das Template-System, Rich Text, Persistenz, der Exit-Weg zur Produktion – ist der Punkt, an dem GJS.Market-Plugins ins Spiel kommen. Jede untenstehende Präsentation ist ein echtes Produkt, bepreist wie angegeben.
Problem: Ein frischer Editor hat eine leere Palette, und niemand baut eine Seite aus einem nackten <div>.
Durchstöbern Sie diese KategorieDie Startpalette: Spalten, Text, Bilder, Links und Video, damit die Leinwand am ersten Tag nutzbar ist.
Tailwind-basierte Blöcke, sodass Seiten, die Nutzer erstellen, zu einem Utility-Design-System passen, das du bereits nutzt.
Bootstrap-5-Gitter- und Komponentenblöcke für Teams, deren Designsystem bereits Bootstrap ist.
Ein Header wurde einmal bearbeitet und auf jeder Seite wiederverwendet, anstatt dass Kopien auseinanderdrifteten.
Problem: Nutzer brauchen einen Anfang, und mehrseitige Projekte benötigen einen Manager, den der Editor nicht ausliefert.
Durchstöbern Sie diese KategorieEine Vorlagenbibliothek im Editor, sodass eine neue Seite von einem fertigen Layout beginnt.
Mehrseitige Projekte mit einer Seitenliste, sodass ein Builder eine Website statt eines einzelnen Dokuments verwaltet.
Ermöglicht es Nutzern, ihre eigenen Abschnitte als wiederverwendbare Blöcke zu speichern – deine Palette wächst, ohne dass du etwas aussendest.
Projektstöbern und -management rund um den Editor – für Teams, die an mehr als einer Sache gleichzeitig arbeiten.
Problem: Jeder geht davon aus, dass reicher Text und funktionierende Formulare eingebaut sind. Keines von beiden ist es, abgesehen von den Basics.
Durchstöbern Sie diese KategorieFormular-Komponenten mit Eingaben, Auswahlen und Validierung von traits, bereit zur Einsendung an Ihre Endpunkte.
Ersetzt den eingebauten Rich-Text-Editor durch CKEditor 5 für Teams, die ernsthafte Textbearbeitung benötigen.
Dasselbe gilt für TinyMCE 6 – jedem bekannt, der von einem traditionellen CMS kommt.
Zusätzliche Formatierungssteuerungen im Standard-Rich-Text-Editor, ohne eine Drittanbieterabhängigkeit hinzuzufügen.
Problem: Der Prototyp, der nie etwas durchgehalten hat, ist der, der nie ausgeliefert wurde.
Durchstöbern Sie diese KategorieLokale Persistenz im Browser: nützlich für Entwürfe, Offline-Bearbeitung und Vorschauumgebungen.
Lagert Projekte in Directus, wenn ein headless Backend bereits Teil deines Stacks ist.
Lädt eine Seite als ZIP von HTML, CSS und Assets herunter – der einfachste mögliche Exportweg.
Veröffentlicht direkt auf Netlify für Produkte, deren Ausgabe eine gehostete, statische Seite ist.
Oder starte in einer Kategorie
Beide Säulen enden mit einem funktionierenden Bauunternehmer. Sie unterscheiden sich darin, wie viel davon man in zwei Jahren noch instand hält.
GrapesJS bietet die visuelle Bearbeitungsgrundlage. GJS.Market-Plugins ermöglichen es dir, deinen Builder um zusätzliche Funktionen zu erweitern, anstatt jede Funktion intern zu bauen.
Fünf wiederkehrende Muster, und was jede von ihnen wirklich mit einem visuellen Editor kauft.
Fügen Sie einem Produkt visuelle Bearbeitung hinzu, dessen Kunden bereits den Support bitten, eine Seite für sie zu ändern.
Baue pro Client eine eigene Bearbeitungsumgebung, anstatt ein CMS zu übergeben, das niemand wollte.
Fügen Sie visuelles Bearbeiten hinzu, ohne ein ganzes Roadmap-Jahr damit zu verbringen, eine Editor-Engine von Grund auf zu schreiben.
Lass Marketer Seiten erstellen und ändern, ohne dass bei jeder Überschrift ein Entwickler eingeweiht ist.
Schaffen Sie kontrollierte interne Bearbeitungsabläufe, bei denen das, was bearbeitet werden kann, genauso wichtig ist wie das, was gebaut werden kann.
Vier Möglichkeiten, einen visuellen Editor auszuliefern. Sie überschneiden sich, aber sie beginnen mit unterschiedlichen Einschränkungen – und wenn man den falschen auswählt, taucht es zu spät auf.
Baue einen visuellen Editor in deiner eigenen Angular-Anwendung, der deinem Team gehört und von deinem Content-Modell geprägt wird. Das ist diese Seite.
Man bettet den Editor in eine bereits existierende Anwendung ein, mit minimaler Oberfläche zwischen beiden.
Einbettbarer Page BuilderEntwickeln Sie ein kundenorientiertes visuelles Bearbeitungsprodukt mit Mietverträgen, Plänen und kundenspezifischer Veröffentlichung.
SaaS-Page BuilderLass den Editor aussehen und sich wie dein eigenes Produkt verhalten, bis hin zum Vokabular in seinen Panels.
White-Label-SeitengeneratorDasselbe auf einem anderen Framework bauen? Das Argument ist für React, Next.js und Vue identisch – nur ändert sich der Lebenszykluscode. React-Page Builder, Next.js-Page Builder, Vue-Page Builder.
Ein Editor ist eine umfangreiche Anwendung, und eine veröffentlichte Seite nicht. Sie als ein Bündel zu behandeln, ist ein Fehler, den man frühzeitig vermeiden sollte.
Nutzer, die den Builder nie öffnen, sollten ihn niemals herunterladen. Eine faule Route hält den Editor aus deinem Hauptpaket heraus.
Erstellen Sie den Editor außerhalb der Angular-Zone und geben Sie ihn nur in den Handlern erneut ein, die den gerenderten Zustand aktualisieren.
Paginieren Sie den Asset Manager mit Ihrem API, anstatt ihm mehrere tausend Bilder auf einmal zu geben.
Erstelle die Instanz, wenn der Editor tatsächlich angezeigt wird, nicht wenn die umgebende Komponente mountet.
Die veröffentlichten Ausgaben sind HTML und CSS. Nichts am Editor muss mitgeliefert werden.
Die Editor-Laufzeit und die veröffentlichte Seite müssen nicht dieselben Leistungsanforderungen haben.
Ein visueller Editor akzeptiert von Nutzern erstellte Inhalte und schreibt sie zurück auf Ihr System. Jede dieser Inhalte gehört auf die Serverseite dieses Austauschs.
Überprüfen Sie bei jedem Aufruf beim Laden, speichern und Veröffentlichen, ob dieser Benutzer an diesem Projekt mitwirken kann.
Lösen Sie den Tenant aus der Sitzung auf, niemals aus einem Parameter, den der Client ändern kann.
Typ und Größe serverseitig validieren und Uploads von einem Ursprung ausliefern, der sie nicht ausführen kann.
Der Speicheradapter läuft im Browser. Seine Endpunkte benötigen dieselbe Authentifizierung wie der Rest deines API.
Wo Editoren benutzerdefinierten Code einbetten können, desinfizieren Sie auf dem Server, bevor dieses Markup an andere ausgeliefert wird.
Das Veröffentlichen verändert, was die Öffentlichkeit sieht. Begrenze die Rate, logge es und sperre es hinter seine eigene Berechtigung.
Das Ausstecken eines Knopfes ändert den UI, nicht den API. Jede Regel, die das UI impliziert, muss ebenfalls dahinter existieren.
Verlasse dich niemals nur auf clientseitige Berechtigungen.
Benötigen Sie Hilfe bei der Integration, Erweiterung oder Anpassung von GrapesJS in Ihrer Angular-Anwendung? Unser Team kann bei der Integration, benutzerdefinierten Plugins, UI-Anpassung und Produktionsimplementierung helfen.
Ein visueller Editor innerhalb einer Angular-Anwendung, der es Nutzern ermöglicht, Seiten zusammenzustellen, indem sie Komponenten auf eine Leinwand ziehen, anstatt Markup zu schreiben. Die Angular-App besitzt Routing, Authentifizierung und Daten; der Editor besitzt die Bearbeitungsfläche.
Ja. GrapesJS ist framework-agnostisch: Es rendert in ein Container-Element, das du ihm gibst, sodass es innerhalb einer Angular-Komponente wie jede andere DOM-basierte Bibliothek funktioniert.
Nein – es ist die visuelle Bearbeitungs-Engine, auf der ein Angular-Page Builder basiert. Es gibt keinen offiziellen Angular-Wrapper; man integriert die Kernbibliothek direkt, die eine Komponente und ein Dienst ist.
Installiere das Paket, behalte die Instanz in einem injizierbaren Service, erstelle es in ngAfterViewInit, sobald der Container im DOM ist, und zerstöre es in ngOnDestroy. Der vollständige Guide behandelt Wrapper, Zonen und Produktionsprobleme.
Ja. Blöcke werden über den Blockmanager mit deinem eigenen Label, deiner Kategorie und deinem Inhalt registriert, sodass die Palette nur Bereiche enthalten kann, die dein Produkt unterstützt.
Ja. Komponententypen werden mit eigenen traits, Drop-Regeln und Verhalten registriert, wodurch der Editor von generischem HTML bis zu deinem Inhaltsmodell eingegrenzt wird.
Ja. Ein gespeichertes Projekt kann als Ausgangspunkt für eine neue Seite neu geladen werden. Vorlagenbibliotheken und -manager sind ebenfalls als Plugins verfügbar, falls du das UI lieber nicht bauen möchtest.
Ja. Registriere einen benutzerdefinierten Speicheradapter, dessen Lade- und Speichermethoden dein API über HttpClient aufrufen, sodass deine Interceptoren, Auth-Header und Fehlerbehandlung wie gewohnt angewendet werden.
Ja. Der Editor erstellt ein JSON-Dokument und kommuniziert nie mit einer Datenbank selbst, daher ist die Speicherort des Dokuments ganz eine Backend-Entscheidung.
Ja, und es ist eine der häufigsten Verwendungszwecke: eine eingeschränkte Blockpalette, markenbezogene Vorlagen und eine Veröffentlichungsaktion, die dorthin schreibt, wo Ihre Marketingseiten bereitgestellt werden.
Ja. Der Editor ersetzt den formularbasierten Bearbeitungsbildschirm; dein CMS behält das Eigentum an Inhaltstypen, Arbeitsabläufen und Berechtigungen.
Ja. Registriere deine eigenen Feldkomponenten als Komponententypen bei traits zur Validierung und Benennung, damit das, was die Nutzer zusammenstellen, auf ein Schema abgebildet wird, das dein Backend versteht.
Ja, aber Mieter ist die Aufgabe deiner Anwendung. Der Editor hat kein Konzept eines Mieters – dein Backend entscheidet, welche Projekte, Assets und Vorlagen der aktuelle Nutzer sehen kann.
Ja. Panels, Icons, Farben, Blockkategorien und Terminologie sind alle konfigurierbar, und du kannst den Editor von deinem eigenen Angular UI über den Befehl API steuern.
Die umliegende Route wird auf dem Server wie gewohnt gerendert; der Editor selbst wird nur im Browser erstellt. Guard-Initialisierung mit isPlatformBrowser und Zurück früh auf dem Server.
Erstelle den Editor innerhalb von runOutsideAngular, damit die Canvas-Interaktion nicht ständig die Änderungserkennung auslöst, und nutze dann NgZone.run in den wenigen Ereignishandlern, die den Zustand deiner Vorlage aktualisieren.
Ja. GrapesJS liefert eigene Typdefinitionen, sodass die Editor-Instanz, ihr Konfigurationsobjekt und ihre Ereignisse in einer gewöhnlichen Angular-TypeScript-Codebasis getippt werden.
Ja. Plugins sind Funktionen, die den Editor empfangen und Komponenten, Blöcke, Befehle oder Panels registrieren. GJS.Market listet kostenlose und kommerzielle Plugins für Blöcke, Rich Text, Speicher, Assets und Export auf.
Nutze Angular für deine Anwendung und GrapesJS für das visuelle Bearbeitungserlebnis. Füge eigene Komponenten, Blöcke, Vorlagen, Speicher- und Veröffentlichungsworkflow hinzu – und erweitere den Builder dann mit GJS.Market-Plugins, wenn du mehr brauchst.
Installiere den Editor, montiere ihn auf einem Container innerhalb einer Angular-Komponente und habe heute Nachmittag etwas auf dem Bildschirm.
LoslegenBlöcke, Vorlagen, Rich Text, Speicher und Export – installieren Sie die Funktionen, die Ihr Produkt benötigt, anstatt sie zu schreiben.
Plugins durchsuchenLebenszyklus, Zonen, SSR, Wrapper und die Produktionscheckliste, von Anfang bis Ende auf der Integrationsseite abgedeckt.
Angular-Leitfaden ansehenDeine Angular-App. Dein Editor. Dein Produkt.