【问题标题】:How could a map make an observable in angular地图如何在角度上进行观察
【发布时间】:2019-07-06 05:49:50
【问题描述】:

我想将映射到一个可观察的角度,以获取我从 api 使用的对象(数组)的属性,因为我想在该数组中进行验证以了解是否更新/创建记录.

下午好,我想做一个查询,我通过 observable 进行 http 查询,如下所示:

public getAllEquipos() : Observable<Equipos[]> {
      return this.http.get<Equipos[]>(this.baseurl + 'equipos')
  }

然后我在角材料的数据表中使用这些数据:

RenderDataTable() {   

  this.service.getAllEquipos().subscribe(  
    (res) => {  
      this.dataSource = new MatTableDataSource();  
      this.dataSource.data = res;  
    //  console.log(this.dataSource.data);
    //  this.dataSource.sort = this.sort; 
      this.dataSource.paginator = this.paginator;
       console.log(res)      
    },  
    (error) => {  
      console.log('Se produjo un error mientras intentaba recuperar Usuarios!' + error);  
    });

}

我要问你一个问题,是否有可能变量 res,它是 subscribe 方法的第一个参数,你会在那个函数之外使用吗?既然是有问题的安排,我向你提到它是因为我需要为我得到的可观察对象制作一个映射,我只获得对象的一个​​属性,也就是说,我只想把这个属性带给我,并且然后使用此对象或数组进行检查。当我想更新/创建记录时,因为取决于 ID 是否已经在数组中,记录将被更新,否则将被创建。

我也不知道如何将地图应用于我的 observable,如果您能帮助我,我将不胜感激。

` Observable <Equipos[]>: in this case <Equipos[]> is an interface `

PD:getAllEquipos() 函数在服务文件中,而 RenderDataTable() 函数在组件中

【问题讨论】:

  • 如果您想在响应处理程序之外使用来自 HTTP 响应对象的属性,您需要在您的组件上创建一个属性并从您的响应处理程序中分配它。
  • @JackA。我认为在我的组件中有一个变量,例如 test 并在函数 RenderDataTable () { // code this.res = test // 其中 test 是我在组件中声明的变量 }

标签: javascript angular typescript


【解决方案1】:

由于我不知道您的创建/更新代码是什么样的,我将把它作为一个函数来执行,如果项目已经存在,则返回 true。我假设您的 Equipos 类包含一个数字 id 属性,该属性唯一地标识每个项目。

@Component()
class TableComponent {

    private existingIds: number[] = []; // initialize with empty array to avoid errors in itemExists

    RenderDataTable() {
        this.service.getAllEquipos().subscribe(  
            (res) => {
                this.dataSource = new MatTableDataSource();  
                this.dataSource.data = res;  
                //  console.log(this.dataSource.data);
                //  this.dataSource.sort = this.sort; 
                this.dataSource.paginator = this.paginator;
                console.log(res);

                // res is an array, so use map function to extract an array of id properties
                this.existingIds = res.map(item => item.id);
            },  
            (error) => {  
                console.log('Se produjo un error mientras intentaba recuperar Usuarios!' + error);  
            });
    }

    private itemExists(id: number) {
        return this.existingIds.includes(id);
    }
}

【讨论】:

    【解决方案2】:

    您可以在服务的 getAllEquipos() 方法或组件的 RenderDataTable() 方法中应用 rxjs map 运算符。无论哪种情况,您都需要pipemap 运算符。

    map 会自动将转换函数返回的值包装在一个 observable 中,以便它继续返回一个 observable 用于附加链接或直接订阅。

    import {pipe} from 'rxjs'
    import {map} from 'rxjs/operators'
    
    //at the service
    public getAllEquipos() : Observable<Equipos[]> {
          return this.http.get<Equipos[]>(this.baseurl + 'equipos')
                                        .pipe(
                                              map(res => res.targetProperty)                                                                    
    
      }
    
    
    //in your component
    RenderDataTable() {   
    
      this.service.getAllEquipos().pipe(map(res => res.targetProperty)).subscribe(  
        (res) => {
          this.dataSource = new MatTableDataSource();  
          this.dataSource.data = res;  
        //  console.log(this.dataSource.data);
        //  this.dataSource.sort = this.sort; 
          this.dataSource.paginator = this.paginator;
           console.log(res)      
        },  
        (error) => {  
          console.log('Se produjo un error mientras intentaba recuperar Usuarios!' + error);  
        });
    
    }
    
    
    

    【讨论】:

    • 感谢您的帮助,一旦我可以测试代码,请注意它是怎样的
    猜你喜欢
    • 2017-05-23
    • 2017-02-03
    • 1970-01-01
    • 2020-05-11
    • 2018-09-24
    • 2021-01-31
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多