返回带有嵌套订阅的布尔值的函数

时间:2018-10-24 17:31:36

标签: angular angular-material2

我有一排用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'的函数必须返回值。” 是否可以将我拥有的功能用于所需的功能? 任何提示/建议将不胜感激

1 个答案:

答案 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> 之类的指令中调用组件方法有时被认为是不好的做法,因为它可能导致性能问题。尽可能使用计算所得的属性。