Angular 17 - 对话框组件未设置样式

问题描述 投票:0回答:1

首先我是 Angular 新手(1 周经验) 问题:我尝试通过对话框编辑待办事项列表中的待办事项。我传入 listItem 的参数,并在对话框中更改标题。数据绑定工作完美,但对话框的样式完全尴尬。你能帮我解决我的问题吗?

Stackblitz:https://stackblitz.com/edit/github-wgums5?file=README.md

todo-list.component.html

<div class="card shadow-lg mt-5 bg-light">
  <div class="card-header text-center border-0"></div>
  <div class="card-body p-4 bg-light">
    <ul class="list-group">
      <div *ngIf="todos.length === 0" class="text-center text-muted">Nothing to do, enjoy some free time my love!</div>      <li
        class="list-group-item mb-2 border py-3 rounded-3 p-4"
        *ngFor="let item of todos"
        [ngClass]="{
          'bg-success': item.priority == 1,
          'bg-warning': item.priority == 2,
          'bg-danger': item.priority == 3
        }"
      >
        <span>
          <i
            (click)="completeToDo(item.id, !item.isDone)"
            [ngClass]="
              item.isDone ? 'fa-solid fa-circle-check fa-xl' : 'fa-regular fa-circle fa-xl'
            "
          ></i>
          <i class="p-3"
            [ngStyle]="{
              'text-decoration': item.isDone ? 'line-through' : 'none'
            }"
            [ngClass]="{
              'text-white': item.priority != 2
            }"
          >
            {{ item.title }}
          </i>
          <span class="float-end text-dark" (click)="deleteToDo(item.id)">
            <i class="fa-solid fa-trash-can"></i>
          </span>
          <span class="float-end text-dark px-3" (click)="openDialog(item)">
            <i class="fa-solid fa-pen-to-square"></i>
          </span>
        </span>
      </li>
    </ul>
  </div>
</div>

todo-list.component.ts

import { Component } from '@angular/core';
import { TodoService } from '../../services/todo.service';
import { UpdateTodoDialogComponent } from '../update-todo-dialog/update-todo-dialog.component';
import {
  MatDialog,
  MAT_DIALOG_DATA,
  MatDialogRef,
  MatDialogTitle,
  MatDialogContent,
  MatDialogActions,
  MatDialogClose,
} from '@angular/material/dialog';

@Component({
  selector: 'app-todo-list',
  templateUrl: './todo-list.component.html',
  styleUrl: './todo-list.component.css'
})
export class TodoListComponent {

  todos: any[] = [];

  constructor(private todoService: TodoService, public dialog: MatDialog) {}

  ngOnInit(): void {
    this.todoService.firestoreCollection.valueChanges({idField:'id'}).subscribe((item) => {
      this.todos = item.sort((a:any, b:any) => {return b.priority - a.priority});
    });
  }

  completeToDo(id:string, newStatus:boolean): void {
    this.todoService.completeToDo(id, newStatus);
  }

  deleteToDo(id:string): void {
    this.todoService.deleteToDo(id);
  }

  updateToDo(id:string, newTitle:string): void {
    this.todoService.updateToDo(id, newTitle);
  }

  openDialog(item: any): void {

    const dialogRef = this.dialog.open(UpdateTodoDialogComponent, {
      width: '250px',
      data: {id: item.id, title: item.title}
    });

    dialogRef.afterClosed().subscribe(newTitle => {
      if (newTitle) {
        this.updateToDo(item.id, newTitle);
      }
    });
  }
}

更新-todo-dialog.component.html

<div class="container justify-content-center">
    <h2 mat-dialog-title>Edit To Do</h2>
    <mat-dialog-content>
      <mat-form-field>
        <input matInput [(ngModel)]="data.title" />
      </mat-form-field>
    </mat-dialog-content>
    <mat-dialog-actions>
      <button mat-button (click)="onNoClick()">Cancel</button>
      <button mat-button [mat-dialog-close]="data.title" cdkFocusInitial>
        Done
      </button>
    </mat-dialog-actions>
</div>

更新-todo-dialog.component.ts

import { Component, Inject } from '@angular/core';
import {
  MatDialog,
  MAT_DIALOG_DATA,
  MatDialogRef,
  MatDialogTitle,
  MatDialogContent,
  MatDialogActions,
  MatDialogClose,
} from '@angular/material/dialog';


@Component({
  selector: 'app-update-todo-dialog',
  templateUrl: './update-todo-dialog.component.html',
  styleUrl: './update-todo-dialog.component.css'
})
export class UpdateTodoDialogComponent {

  constructor(
    public dialogRef: MatDialogRef<UpdateTodoDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any,
  ) {}

  onNoClick(): void {
    this.dialogRef.close();
  }
}

app.module.ts

import { AppComponent } from './app.component';
import { TodoListComponent } from './components/todo-list/todo-list.component';
import { TodoComponent } from './components/todo/todo.component';
import {MatRadioModule} from '@angular/material/radio';
import { FormsModule } from '@angular/forms';
import {MatDialogModule} from "@angular/material/dialog";
import { UpdateTodoDialogComponent } from './components/update-todo-dialog/update-todo-dialog.component';
import { MatFormFieldModule } from '@angular/material/form-field';

@NgModule({
  declarations: [
    AppComponent,
    TodoListComponent,
    TodoComponent,
    UpdateTodoDialogComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    MatRadioModule, 
    FormsModule,
    MatDialogModule, 
    MatFormFieldModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.html

<div class="container">
  <div class="row justify-content-center">
    <div class="col-md-6">
      <app-todo></app-todo>
      <app-todo-list></app-todo-list>
    </div>
  </div>
</div>

我希望它看起来像文档中的样式: 在此输入图片描述

但它看起来像这样: 在此输入图片描述

angular angular-material material-dialog
1个回答
0
投票

在您的

app.module.ts
中,请务必添加
MatInputModule
BrowserAnimationsModule

您似乎还忘记为您的材质组件包含一个主题。 您可以添加

@import '~@angular/material/prebuilt-themes/deeppurple-amber.css';
(或任何其他预构建的主题),之后看起来应该会更好。

看到这个Stackblitz(从你的分叉)

© www.soinside.com 2019 - 2024. All rights reserved.