Angular 路由参数值未与 ngClass Ternary 绑定
Angular Route Param Values Not Binding with ngClass Ternary
我的 return 值来自我的 html 三进制,previewForm.value['joint_application'] 绑定了不正确的字符串输出表格-page.component.html。用户应从此预览页面导航回主页,以另一种形式编辑此值,该形式使用参数填充 URL,然后由 previewForm
处理
previewForm.value['joint_application'] 从 URL 中获取参数进行解析,以确定参数是真还是假,然后在 html 上相应地显示它。
这个三元组似乎没有根据 URL:
相应地交替
{{ previewForm.value['joint_application'] ? 'Me & My Partner': 'Just Me' }}
所以如果 URL 中的 joint_application=true 我期望 'Me & My Partner',但是我只得到 'Just Me'
然而,这确实会相应地从 true 和 false 中交替
{{ previewForm.value['joint_application'] }}
我的典型 URL 是:
http://localhost:4200/quote-form;joint_application=true
从我的主页通过以下路径传递到此报价单页面:
app.module.ts
const appRoutes: Routes = [
{ path: 'quote-form', component: FormPageComponent },
]
形式-page.component.ts
export class FormPageComponent implements OnInit {
public previewForm: FormGroup;
constructor(
private fb: FormBuilder,
private route: ActivatedRoute,
private router: Router
){ }
ngOnInit() {
this.previewParamValues()
}
previewParamValues() {
this.route.params.subscribe(params => {
this.previewForm = this.fb.group({
joint_application: params.joint_application,
});
})
}
形式-page.component.html
<form [formGroup]="previewForm">
<div class="form-group form-inline">
<h6 small ><b>Quotes For: </b></h6>
<h6 small>{{ previewForm.value['joint_application'] ? 'Me & My Partner': 'Just Me' }}</h6>
</div>
</form>
您需要创建一个表单控件,而不是在创建表单组时只传递值。
previewParamValues() {
this.route.params.subscribe(params => {
this.previewForm = this.fb.group({
// <---- create control here
joint_application: this.fb.control(params.joint_application),
});
})
}
还有一句警告 - 小心将您的参数值转换为布尔值。如果您的参数看起来像 joint_application=false
,我怀疑您只会得到字符串值 "false"
,这仍然是真实的。
相反,您应该使用布尔值创建表单控件:
Angular <= 8
this.fb.control(!!params.joint_application &&
params.joint_application.toLowerCase() === 'true')
Angular >= 9
this.fb.control(params.joint_application?.toLowerCase() === 'true')
编辑
"bang bang" 运算符 !!
在 <= v8 版本中 严格 不是必需的,除非您关心与严格布尔类型的比较。
这是一个相当简单的例子:
const value = null;
const result1 = value && value === 'true';
const result2 = !!value && value === 'true';
const check1 = result1 === false;
const check2 = result2 === false;
console.log("(value && value === 'true') === false");
console.log(check1);
console.log("(!!value && value === 'true') === false");
console.log(check2);
考虑一下,>= v9 版本中的等价物是
this.fb.control(params.joint_application?.toLowerCase() === 'true' || false)
我的 return 值来自我的 html 三进制,previewForm.value['joint_application'] 绑定了不正确的字符串输出表格-page.component.html。用户应从此预览页面导航回主页,以另一种形式编辑此值,该形式使用参数填充 URL,然后由 previewForm
处理previewForm.value['joint_application'] 从 URL 中获取参数进行解析,以确定参数是真还是假,然后在 html 上相应地显示它。
这个三元组似乎没有根据 URL:
相应地交替{{ previewForm.value['joint_application'] ? 'Me & My Partner': 'Just Me' }}
所以如果 URL 中的 joint_application=true 我期望 'Me & My Partner',但是我只得到 'Just Me'
然而,这确实会相应地从 true 和 false 中交替
{{ previewForm.value['joint_application'] }}
我的典型 URL 是:
http://localhost:4200/quote-form;joint_application=true
从我的主页通过以下路径传递到此报价单页面:
app.module.ts
const appRoutes: Routes = [
{ path: 'quote-form', component: FormPageComponent },
]
形式-page.component.ts
export class FormPageComponent implements OnInit {
public previewForm: FormGroup;
constructor(
private fb: FormBuilder,
private route: ActivatedRoute,
private router: Router
){ }
ngOnInit() {
this.previewParamValues()
}
previewParamValues() {
this.route.params.subscribe(params => {
this.previewForm = this.fb.group({
joint_application: params.joint_application,
});
})
}
形式-page.component.html
<form [formGroup]="previewForm">
<div class="form-group form-inline">
<h6 small ><b>Quotes For: </b></h6>
<h6 small>{{ previewForm.value['joint_application'] ? 'Me & My Partner': 'Just Me' }}</h6>
</div>
</form>
您需要创建一个表单控件,而不是在创建表单组时只传递值。
previewParamValues() {
this.route.params.subscribe(params => {
this.previewForm = this.fb.group({
// <---- create control here
joint_application: this.fb.control(params.joint_application),
});
})
}
还有一句警告 - 小心将您的参数值转换为布尔值。如果您的参数看起来像 joint_application=false
,我怀疑您只会得到字符串值 "false"
,这仍然是真实的。
相反,您应该使用布尔值创建表单控件:
Angular <= 8
this.fb.control(!!params.joint_application &&
params.joint_application.toLowerCase() === 'true')
Angular >= 9
this.fb.control(params.joint_application?.toLowerCase() === 'true')
编辑
"bang bang" 运算符 !!
在 <= v8 版本中 严格 不是必需的,除非您关心与严格布尔类型的比较。
这是一个相当简单的例子:
const value = null;
const result1 = value && value === 'true';
const result2 = !!value && value === 'true';
const check1 = result1 === false;
const check2 = result2 === false;
console.log("(value && value === 'true') === false");
console.log(check1);
console.log("(!!value && value === 'true') === false");
console.log(check2);
考虑一下,>= v9 版本中的等价物是
this.fb.control(params.joint_application?.toLowerCase() === 'true' || false)