You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中点击列表元素添加删除线并修改completed状态

解决方案

1. 修改模板(HTML)

给<li>元素添加点击事件绑定,同时根据completed字段动态设置文本装饰样式:

<h1>To Do List</h1>
<input #newTodo>
<button (click)="addTodo(newTodo.value)">Add Todo</button>

<ul>
  <li 
    *ngFor="let todo of todos" 
    (click)="toggleTodo(todo)"
    [style.text-decoration]="todo.completed ? 'line-through' : 'none'"
  >
    {{todo.title}}
  </li>
</ul>

如果想让样式更灵活,推荐用CSS类的方式:
先在组件CSS文件中定义类:

.completed {
  text-decoration: line-through;
  color: #999; /* 可选:添加灰色调增强视觉区分 */
}

再修改模板为类绑定:

<li 
  *ngFor="let todo of todos" 
  (click)="toggleTodo(todo)"
  [class.completed]="todo.completed"
>
  {{todo.title}}
</li>

2. 在组件中实现状态切换方法

在AppComponent里新增toggleTodo方法,用来切换对应todo项的completed状态:

export class AppComponent implements OnInit {
  title = 'todo-app';
  // 替换any为明确类型,增强代码安全性
  todos: { userId: number; title: string; completed: boolean }[] = [];

  constructor(private service: TodoService) {}

  ngOnInit() {
    this.service.getTodos()
      .subscribe(response => {
        this.todos = response;
      });
  }

  addTodo(title: string){
    this.todos.push({
      userId: 1, 
      title, 
      completed: false
    });
  }

  // 新增切换状态的方法
  toggleTodo(todo: { userId: number; title: string; completed: boolean }) {
    todo.completed = !todo.completed;
  }
}

补充:类型优化(可选但推荐)

为了彻底避免any,可以定义一个Todo接口:

interface Todo {
  userId: number;
  title: string;
  completed: boolean;
}

export class AppComponent implements OnInit {
  title = 'todo-app';
  todos: Todo[] = [];

  // ... 其余代码不变

  toggleTodo(todo: Todo) {
    todo.completed = !todo.completed;
  }
}

现在点击列表项时,会自动切换该项的completed状态,同时触发删除线样式的显示/隐藏。

内容的提问来源于stack exchange,提问作者AllanSwe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:25:22