为什么 *ngIF 在我的 Angular 应用程序中总是评估为真?
Why does *ngIF always evaluate to true in my Angular app?
我定义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>✓</span></span>
<ng-template #elseBlock>
<span>✕</span>
</ng-template>
<span>{{todo.title}}</span>
</li>
然而 todo.complete
的计算结果总是 true
,尽管传入数据并不总是 true
。 (我通过使用 Postman 调用服务来验证这一点...)
为什么值总是 true
?
我应该注意到 todo.title
正确呈现。
更新
通过 Postman returns 调用 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
}
]
我确定 complete
是 string
而不是 boolean
。
因为 *ngIf
中的字符串(通常在 JavaScript if(...)
中)总是解析为 true
(只要它不为空(''
)),*ngIf
块总是显示在屏幕上,而 elseBlock
不是。
用这个来修复它:
<span *ngIf="todo.complete === 'true'; else elseBlock"><span>✓</span></span>
我定义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>✓</span></span>
<ng-template #elseBlock>
<span>✕</span>
</ng-template>
<span>{{todo.title}}</span>
</li>
然而 todo.complete
的计算结果总是 true
,尽管传入数据并不总是 true
。 (我通过使用 Postman 调用服务来验证这一点...)
为什么值总是 true
?
我应该注意到 todo.title
正确呈现。
更新
通过 Postman returns 调用 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
}
]
我确定 complete
是 string
而不是 boolean
。
因为 *ngIf
中的字符串(通常在 JavaScript if(...)
中)总是解析为 true
(只要它不为空(''
)),*ngIf
块总是显示在屏幕上,而 elseBlock
不是。
用这个来修复它:
<span *ngIf="todo.complete === 'true'; else elseBlock"><span>✓</span></span>