【问题标题】:Why does *ngIF always evaluate to true in my Angular app?为什么 *ngIF 在我的 Angular 应用程序中总是评估为 true?
【发布时间】:2018-10-14 15:35:09
【问题描述】:

我定义Todo如下:

export class Todo {
  id: number;
  title: string;
  complete: boolean = false;
  editMode: boolean = false;
  }

我有以下数据服务:

  getAllTodos(): Observable<Array<Todo>> {
     return this.aHttpService.get<Array<Todo>>('http://localhost:3000/todos');
  }

然后,我有这个组件:

import { Component, OnInit } from '@angular/core';
import { TodoDataService } from '../todo-data.service';
import { Todo } from '../todo';
import { Observable } from 'rxjs/Observable';

@Component({
  selector: 'app-all-tasks',
  templateUrl: './all-tasks.component.html',
  styleUrls: ['./all-tasks.component.css']
})
export class AllTasksComponent implements OnInit {
  constructor(private todoDataService: TodoDataService) {}
  allTodos: Observable<Array<Todo>>;

  ngOnInit() {
    this.allTodos = this.todoDataService.getAllTodos();
  }
}

在我的模板中:

<li *ngFor="let todo of allTodos | async" >
  <span *ngIf="todo.complete; else elseBlock"><span>&#10003;</span></span>
  <ng-template #elseBlock>
    <span>&#x2715;</span>
  </ng-template>
  <span>{{todo.title}}</span>
</li>

然而,todo.complete 的计算结果总是true,尽管传入的数据并不总是true。 (我通过使用 Postman 调用服务来验证这一点......)

为什么值总是true

我应该注意到todo.title 正确呈现。

更新

通过 Postman 调用 http://localhost:3000/todos 返回:

[
{
    "id": 1,
    "title": "Learn TypeScript",
    "complete": "true",
    "editMode": "false"
},
{
    "id": 2,
    "title": "Learn Angular changed",
    "complete": "true",
    "editMode": "false"
},
{
    "id": 3,
    "title": "Learn to Read",
    "complete": "true",
    "editMode": "false"
},
{
    "id": 4,
    "title": "Learn to Write",
    "complete": "false",
    "editMode": "false"
},
{
    "title": "Learn how to type",
    "complete": "true",
    "editMode": "false",
    "id": 5
},
{
    "title": "Learn how to drive",
    "complete": "false",
    "editMode": "false",
    "id": 6
}
]

【问题讨论】:

  • 您能否通过从组件本身订阅服务来检查 isComplete 的值 this.todoDataService.getAllTodos().subscribe((response)=>{ console.log(response)});
  • 你试过*ngIf="todo.complete == true"
  • @Marshal -- 嗯,这样做会导致他们都评估false
  • @NickHodges 虽然我的评论很接近,但我只是假设该值是布尔值而不是字符串。
  • @Marshal -- 感谢您的帮助。

标签: angular typescript angular-ng-if


【解决方案1】:

我确信complete 会以string 而不是boolean 的形式出现。

由于*ngIf(通常在JavaScript if(...))中的字符串总是解析为true(只要它不为空('')),*ngIf 块总是显示在屏幕和elseBlock 不是。

用这个来修复它:

<span *ngIf="todo.complete === 'true'; else elseBlock"><span>&#10003;</span></span>

【讨论】:

  • 是的,做到了。谢谢。
  • “因为 *ngIf 中的字符串总是解析为 true”。它与ngIf 几乎没有关系,它只是常规的 JavaScript 强制:if ("true")if ("false") 都会采用真分支
  • @LazarLjubenović,我很抱歉,但我是在手头的问题的背景下谈论的。我会相应地更新答案。感谢您的投入。 :)
  • 感谢@ConnorsFan,。固定:)
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 2022-01-22
  • 2011-05-20
相关资源
最近更新 更多