#angular #angular-ng-if #angular10
#angular #angular-ng-if #angular10
Вопрос:
Я видел много вопросов, касающихся этой проблемы. но мне это не помогло.
Вот мой Html
<div class="pl-lg-4">
<div *ngIf="isStorySelected; else hi" class="row">
<div class="col-lg-12">
<div class="form-group">
<label class="form-control-label" for="input-username">Story Name</label>
amp;nbsp; amp;nbsp;<label class="form-control-label" for="input-username">Selected option</label>
</div>
</div>
</div>
<ng-template #hi>
<div class="row">
<div class="col-lg-12">
<div class="form-group">
<label class="form-control-label">Select Story</label>
<select class="form-control form-control-alternative" value="">
<option>some option one</option>
<option>some option 2</option>
</select>
</div>
</div>
</div>
</ng-template>
если бы я использовал * ngIf подобным образом, он ничего не показывал. но использование like ngIf показывает первое содержимое.
Вот мой компонент.
import { Component, OnInit } from '@angular/core';
import { Route } from '@angular/compiler/src/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-create-episodes',
templateUrl: './create-episodes.component.html',
styleUrls: ['./create-episodes.component.scss']
})
export class CreateEpisodesComponent implements OnInit {
public activeRoutes: ActivatedRoute;
public storyId: string;
public isStorySelected = false;
constructor(activeRoutes: ActivatedRoute) {
this.activeRoutes = activeRoutes;
}
ngOnInit() {
this.storyId = this.activeRoutes.snapshot.paramMap.get('id');
if (this.storyId) {
console.log('1');
this.isStorySelected = true;
} else {
console.log('2');
this.isStorySelected = false;
}
}
}
здесь я добавил URL-адрес stackblitz:https://stackblitz.com/edit/angular-lmxswk?file=src/app/app.component.ts
Я уже импортировал CommonModule в AppModule.
И я использую последнюю версию Angular. (10)
Комментарии:
1. Вы вывели isStorySelected на экран, чтобы отобразить его текущее значение? Теперь вы используете его только для управления условием if. Вам нужно отобразить его значение после того, как вы будете уверены в своем коде.
2. можете ли вы создать демонстрацию stackblitz для этого
3. @PalakJadav уверен.
4. @LuDeveloper Я не понял, что ты имеешь в виду?
5. здесь stackblitz.com/edit/angular-lmxswk?file=src/app / …
Ответ №1:
Смотрю на интерфейс ActivatedRoute
paramMap
возвращает Observable<ParamMap>
, следовательно, вам нужно преобразовать его в observable
name = 'Angular';
public storyId: Observable<boolean>;
public router: ActivatedRoute;
constructor(router: ActivatedRoute) {
this.router = router;
}
ngOnInit(){
this.storyId = this.router.paramMap.pipe(
map((res) =>{
const currentId = res.get('id');
if(currentId){
return true;
} else {
return false;
}
}));
}
Внутри шаблона
<div *ngIf="storyId | async; else hi" class="row"></div>
Здесь работает stackblitz
Ответ №2:
Надеюсь, это решит вашу проблему. отсутствие then
опции вызывает проблему.
<div *ngIf="isStorySelected; then hello; else hi" class="row">
<ng-template #hello>
<h1>Hello</h1>
</ng-template>
<ng-template #hi>
<h1>Hi</h1>
</ng-template>
</div>
Комментарии:
1. Вы проверили, является ли значение
storyId
после инициализации? Похоже, что проблема в маршрутизаторе приложений….