【发布时间】:2018-10-08 10:23:02
【问题描述】:
在https://github.com/jimshowalter/vocabutron/blob/master/src/app/settings/settings.component.html 中,应用程序启动时仅显示设置按钮。点击按钮,按钮消失,取而代之的是设置编辑器。编辑设置并提交,您可以看到它被推送到设置服务。提交也会使组件消失,并带回设置按钮。但是第二次单击设置按钮时,设置丢失。控制台日志显示设置组件根本没有任何活动。它似乎已经死了。然而,为设置添加一个值并提交它,组件结果仍然存在(如控制台所示)。
为什么不重新显示组件用现有数据填充编辑器?
import { Component, OnInit, isDevMode } from "@angular/core";
import { SettingsService } from "../settings.service";
import { Settings } from "../settings";
@Component({
selector: "app-settings",
templateUrl: "./settings.component.html",
styleUrls: ["./settings.component.css"]
})
export class SettingsComponent implements OnInit {
model: Settings = null;
display: boolean = false;
constructor(private settingsService: SettingsService) {
if (isDevMode) {
console.log("SettingsComponent.constructed");
}
}
private updateSettings() {
if (isDevMode) {
console.log("SettingsComponent.updateSettings");
}
this.model = this.settingsService.get();
}
ngOnInit() {
if (isDevMode) {
console.log("SettingsComponent.ngOnInit");
}
this.settingsService.changedMessage.subscribe(changed =>
this.updateSettings()
);
}
onSubmit(): void {
let result = this.settingsService.put(this.model);
if (isDevMode) {
console.log("SettingsComponent.onSubmit: " + JSON.stringify(result));
}
this.display = false;
}
}
<div *ngIf=!display class="container">
<button type="button" class="btn btn-success" (click)="display=true">Settings</button>
</div>
<div *ngIf=display class="container">
<h2>Settings</h2>
<form (ngSubmit)="onSubmit(); settingsForm.reset()" #settingsForm="ngForm">
<div class="form-group">
<input type="number" class="form-control" id="settings" [(ngModel)]="model.maxWords" required pattern="([1-9]+[0-9]*)+"
name="settings" #settingsModel="ngModel">
</div>
<div [hidden]="settingsModel.valid || settingsModel.pristine" class="alert alert-danger">
Max words is required and must be a number from 1-N.
</div>
<button type="submit" class="btn btn-success" [disabled]="!settingsForm.form.valid">Submit</button>
</form>
</div>
export class Settings {
maxWords: number = 3;
}
import { Injectable, isDevMode } from "@angular/core";
import { BehaviorSubject } from "rxjs";
import { Settings } from "./settings";
@Injectable({
providedIn: "root"
})
export class SettingsService {
changedMessageSource = new BehaviorSubject("changed");
changedMessage = this.changedMessageSource.asObservable();
private settings: Settings = new Settings();
constructor() {
if (isDevMode) {
console.log("SettingsService constructed");
}
}
get(): Settings {
if (isDevMode) {
console.log("SettingsService.get");
}
return this.settings;
}
changed() {
if (isDevMode) {
console.log("SettingsService.changed");
}
this.changedMessageSource.next("changed");
}
put(settings: Settings): Settings {
this.settings = settings;
this.changed();
if (isDevMode) {
console.log("SettingsService.put: " + JSON.stringify(this.settings));
}
return this.settings;
}
}
【问题讨论】:
-
请发布相关代码,而不是链接。如果该链接将来失效,这个问题将完全模棱两可。
标签: angular angular-ng-if