首先,我是Angular新手(1周经验) 问题:我try 通过对话框从ToDo-List中编辑ToDo.我传递了listProject的参数,并在对话框中我想更改标题.数据绑定工作得很完美,但对话框的样式却完全尴尬.你能帮我解决我的问题吗?

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);
      }
    });
  }
}

update-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>

update-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>

我希望它看起来像文档中的风格: enter image description here

但看起来是这样的: enter image description here

推荐答案

在您的app.module.ts中,确保添加MatInputModuleMatButtonModuleBrowserAnimationsModule.

您似乎还忘记为material 组件包括主题. 您可以添加@import '~@angular/material/prebuilt-themes/deeppurple-amber.css';个(或任何其他预构建主题),之后它应该看起来更好.

查看这Stackblitz(从您的Forking )

Angular相关问答推荐

Angular x SCSS:Rgba不判断HEX值

Angular 输入信号和净化值

*ngFor循环中令人困惑的Angular 行为

接收错误NullInjectorError:R3InjectorError(_AppModule)[config—config]....>过度安装Angular—Markdown—Editor

运行容器后,Docker容器立即退出

路由在全局导航中总是给我/甚至使用相对路径

成Angular 的嵌套router-outlet

是否自动处理Angular /RxJS观测数据的取消订阅

如何将角17中的嵌套组件与独立组件一起使用?

一个接一个的Angular http请求,但只关心第一个

Angular 为什么延迟加载返回空路径?

升级到 Webpack 5.79.0 后 NX Angular 项目构建失败

以 Angular 形式添加动态控件失败

Angular 按钮指令错误地附加子元素

Angular 15:在范围内提供相同标记时附加到提供的值

将数组传递给 URLSearchParams,同时使用 http 调用获取请求

找不到模块'webpack'

Angular 2:无法绑定到 x,因为它不是已知的本机属性

无法在 RxJs 6 和 Angular 6 中使用 Observable.of

如何在 Angular 2 中链接 HTTP 调用?