From bbfcb40ef10bd8901823f120c94e4881fcc46c69 Mon Sep 17 00:00:00 2001 From: Brandon Roberts Date: Sat, 6 May 2023 20:18:09 -0500 Subject: [PATCH] feat(astro-angular): add support for render and client component providers (#376) --- .../src/components/card.component.ts | 8 +++ .../src/components/todos.component.ts | 36 +++++++++++ apps/astro-app/src/pages/index.astro | 3 + packages/astro-angular/README.md | 64 ++++++++++++++++--- packages/astro-angular/src/client.ts | 10 ++- packages/astro-angular/src/index.ts | 24 ++++++- packages/astro-angular/src/server.ts | 8 ++- packages/astro-angular/tsconfig.lib.json | 2 +- 8 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 apps/astro-app/src/components/todos.component.ts diff --git a/apps/astro-app/src/components/card.component.ts b/apps/astro-app/src/components/card.component.ts index 2841df688..5042219ec 100644 --- a/apps/astro-app/src/components/card.component.ts +++ b/apps/astro-app/src/components/card.component.ts @@ -1,9 +1,12 @@ import { ChangeDetectionStrategy, Component, + inject, Input, ViewEncapsulation, } from '@angular/core'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { HttpClient, provideHttpClient } from '@angular/common/http'; @Component({ selector: 'astro-card', @@ -90,4 +93,9 @@ export class CardComponent { @Input() href = ''; @Input() title = ''; @Input() body = ''; + + static renderProviders = [provideHttpClient()]; + static clientProviders = [CardComponent.renderProviders, provideAnimations()]; + + private _http = inject(HttpClient); } diff --git a/apps/astro-app/src/components/todos.component.ts b/apps/astro-app/src/components/todos.component.ts new file mode 100644 index 000000000..1029e7a55 --- /dev/null +++ b/apps/astro-app/src/components/todos.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit, inject } from '@angular/core'; +import { NgFor } from '@angular/common'; +import { provideHttpClient, HttpClient } from '@angular/common/http'; + +interface Todo { + id: number; + title: string; + completed: boolean; +} + +@Component({ + selector: 'app-todos', + standalone: true, + imports: [NgFor], + template: ` +

Todos

+ + + `, +}) +export class TodosComponent implements OnInit { + static clientProviders = [provideHttpClient()]; + + http = inject(HttpClient); + todos: Todo[] = []; + + ngOnInit() { + this.http + .get('https://jsonplaceholder.typicode.com/todos') + .subscribe((todos) => (this.todos = todos)); + } +} diff --git a/apps/astro-app/src/pages/index.astro b/apps/astro-app/src/pages/index.astro index 81c523cf4..d70978607 100644 --- a/apps/astro-app/src/pages/index.astro +++ b/apps/astro-app/src/pages/index.astro @@ -3,6 +3,7 @@ import Layout from '../layouts/Layout.astro'; import Card from '../components/Card.astro'; import { CardComponent } from '../components/card.component.ts'; import { Instructions } from '../components/Instructions'; +import { TodosComponent } from '../components/todos.component.ts'; const serverSideTitle = 'Angular (server side binding)'; --- @@ -45,6 +46,8 @@ const serverSideTitle = 'Angular (server side binding)'; /> + +