代码之家  ›  专栏  ›  技术社区  ›  anakin59490

角度5-组件和服务之间的通信

  •  4
  • anakin59490  · 技术社区  · 6 年前

    我使用角度5。 目的是在登录正常时加载数据,并在其他组件中使用这些数据。 通过使用带有getActiveTasks方法和getStats方法的服务类加载数据。 登录组件:

    @Component({
      selector: 'app-login',
      templateUrl: './login.component.html',
      styleUrls: ['./login.component.css']
    })
    export class LoginComponent {
    
      constructor(private auth: AuthenticationService,
                  private klinckServices: KlinckServices,
                  private router: Router) { }
    
      loadData($event) {
        console.log('Authentification OK');
        let success;
        this.klinckServices.getActiveTasks(this.auth.getEcmUsername())
          .then((webScriptdata) => {
              console.log('KlinckSercices - loadData');
              success = webScriptdata;
              this.klinckServices.listTasks = success.data as ActiveTask[];
              this.router.navigate([this.klinckServices.getStats()]);
              console.log(this.klinckServices.listServices);
            },
            msg => {
              alert(msg);
              return '';
            });
       // this.router.navigate([this.klinckServices.loadData()]);
      }
    }
    

    服务类别:

    @Injectable()
    export class KlinckServices {
    
      listTasks: ActiveTask[];
      listServices: Stats [] = [];
    
      constructor(private apiService: AlfrescoApiService,
                  private auth: AuthenticationService) {
        console.log('KlinckServices - constructor');
      }
      getStats(): string {
        this.listTasks.forEach((item, index) => {
          if (this.getServicesInListTasks(item.properties.wfvd_nomService) !== null) {
            if (! this.getServicesInListServices(item.properties.wfvd_nomService)) {
              const listLength = this.listTasks.filter(item2 => item2.properties.wfvd_nomService === item.properties.wfvd_nomService).length;
              console.log(listLength);
              const at: ActiveTask[] = [];
              for (let i = 0; i < listLength; i++) {
                at.push(this.listTasks.filter(item2 => item2.properties.wfvd_nomService === item.properties.wfvd_nomService)[i]);
              }
              this.listServices.push({
                data: at,
                count: listLength,
                service: item.properties.wfvd_nomService
              });
            }
          }
        });
        return '/dashboard';
      }
      getServicesInListServices( serviceSearch: string) {
        return(this.listServices.find( x => x.service === serviceSearch));
      }
      getServicesInListTasks( serviceSearch: string) {
        return(this.listTasks.find( x => x.properties.wfvd_nomService === serviceSearch));
      }
    

    加载仪表板组件时,我需要检索以下数据:

    @Component({
      selector: 'app-dashboard',
      templateUrl: './dashboard.component.html',
      styleUrls: ['./dashboard.component.css']
    })
    export class DashboardComponent implements OnInit, AfterViewInit 
    {
      @ViewChild(DataTableDirective) datatableElement: DataTableDirective;
      @Input() public klinckServices: KlinckServices;
    
      listTasks: ActiveTask[];
      listPatients: Patient[];
      listMedecins: Medecin[];
      listDocType: Typologie[];
      listServices: Stats [] = [];
      dtOptions: any = {};
      docNodeId: string;
      detailTaskId: any;
    
      constructor(private auth: AuthenticationService,
                  public dialog: MatDialog,
                  private http: HttpClient) 
      {
        console.log('DashboardComponent - constructor');
        this.listServices = this.klinckServices.listServices;
        console.log(this.listServices);
        this.getPatients();
        this.getMedecins();
        this.getDocumentType();
      }
    

    但我在控制台中收到此错误消息:“error TypeError:无法读取未定义的属性‘listServices’”

    那么,组件和服务之间通信的最佳方式是什么呢?

    2 回复  |  直到 6 年前
        1
  •  2
  •   CornelC    6 年前

    您应该像在 LoginComponent

    constructor(private klinckServices: KlinckServices
    

    您还应该将其提供给模块

    providers: [KlinckServices]
    
        2
  •  1
  •   Kamil Kiełczewski    6 年前

    例如,您可以:

    1. 使用 角度中的单例服务 并在登录时加载一次数据
    2. 不是在登录时加载数据,而是在Dashboard init上加载数据(OnInit方法,您在类定义中使用该方法的接口),并且在构造函数中必须注入KlinkService才能将其用作 @CornelC公司 在回答中提及)。

    您还有一个问题:为什么不在您的服务中使用Rxjs(这在安圭拉是标准的) KlinkService.getActiveTasks (因为你称之为承诺)?