代码之家  ›  专栏  ›  技术社区  ›  Miguel Teixeira

Angular2:Http。获取未定义的映射

  •  0
  • Miguel Teixeira  · 技术社区  · 7 年前

    我有一个使用这些导入定义的服务:

    import { Injectable } from "@angular/core";
    import { HttpClient } from "@angular/common/http";
    import { Observable } from "rxjs/Observable";
    import "rxjs/add/operator/map";
    import { Subject } from "rxjs/Subject";
    import { Navigation } from "../Shared/app.home";
    import { Module } from "../Shared/app.home";
    

    然后在服务中我定义了一个方法:

    getNavigationModules(): Observable<Navigation[]> {
        return this.http.get<Module[]>("/api/modules/getuserpreferences").map((mods) => {
            return mods.map(m => {
                var nav = new Navigation();
                nav.id = m.Id;
                nav.name = m.Name;
                nav.isFavorite = m.IsFavorite;
                nav.url = m.FriendlyUrl;
                nav.status = (m.ModuleProperties["Status"] != null && m.ModuleProperties["Status"] === "Online") ? "on" : "off" ;
                nav.type = m.Type;
    
                return nav;
            });
        });
    }
    

    调用该方法时,我得到的错误是map未定义。 调用mods时。映射我假设通过调用http。获取mods将是一个模块数组,但当我使用调试器(Chrome)时,我看到调试器将mods视为一个具有属性Modules的对象,这就是模块数组。

    enter image description here

    但是如果我把代码改成mods。模块。map我在编译时出错,因为mods实际上是一个模块[],而不是一个对象。

    我错过了什么?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   JB Nizet    7 年前

    您告诉TypeScript后端将返回的是一个模块数组。但事实并非如此。这是一个对象,有一个字段名为 Modules ,这是一个模块数组。因此,请告诉键入脚本的正确内容:

    getNavigationModules(): Observable<Navigation[]> {
        return this.http.get<{Modules: Module[];}>("/api/modules/getuserpreferences").map((mods) => {
            return mods.Modules.map(m => {
                var nav = new Navigation();
                nav.id = m.Id;
                nav.name = m.Name;
                nav.isFavorite = m.IsFavorite;
                nav.url = m.FriendlyUrl;
                nav.status = (m.ModuleProperties["Status"] != null && m.ModuleProperties["Status"] === "Online") ? "on" : "off" ;
                nav.type = m.Type;
    
                return nav;
            });
        });
    }