我有一排用ngFor循环创建的mat-chexbox。
<div class="permission-one" *ngFor="let permission of permissions">
<mat-checkbox [disabled]="(!isEdit && userIndex !== i) || (isEdit && userIndex !== i)" [checked]="isChecked(fauxUser.userId, permission)" (change)="checkboxSelected($event, permission.code)"></mat-checkbox>
</div>
要查看创建时是否需要选中该复选框,我正在调用isChecked(),如下所示:
isChecked(userId: number, permission: Permission): boolean {
this.adminService.getUserAccess(this.companyId, userId)
.subscribe((userAccessRes: UserPermission) => {
for (const special of userAccessRes.specialPrograms) {
if(special.programCode === permission.code && special.userAccessId !==0)
{
return true;
} else {
return false;
}
}
});
}
但是,由于与订阅嵌套,我无法弄清楚如何将if语句的返回值获取到适当的级别以将其返回给该函数。 现在,我的错误是“其声明类型既不是'void'也不是'any'的函数必须返回值。” 是否可以将我拥有的功能用于所需的功能? 任何提示/建议将不胜感激
答案 0 :(得分:1)
您不能直接返回布尔值(您的java.io.IOException: Cannot run program "clear": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
at java.lang.Runtime.exec(Runtime.java:450)
at java.lang.Runtime.exec(Runtime.java:347)
at chatbot.chatbot.main(chatbot.java:29)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 4 more
BUILD SUCCESSFUL (total time: 4 seconds)
语句位于订阅回调中,而不是component方法本身),您需要使用RxJS's map
operator返回另一个return
并使用async
pipe从您的角度来看:
脚本端:
Observable
查看侧:
import {Observable} from 'rxjs';
import {map} from 'rxjs/operators';
// ...
isChecked(userId: number, permission: Permission): Observable<boolean> {
return this.adminService.getUserAccess(this.companyId, userId).pipe(
map((userAccessRes: UserPermission) => {
// test your permission here and return true or false
})
);
}
注意:在诸如<mat-checkbox [checked]="isChecked(fauxUser.userId, permission) | async"></mat-checkbox>
之类的指令中调用组件方法有时被认为是不好的做法,因为它可能导致性能问题。尽可能使用计算所得的属性。