如何访问特定的Observable项目?

时间:2017-02-07 13:52:42

标签: angular typescript observable

我有一个功能:

getCategories(): Observable<any>
        {
         return this.category.find({where: {clientId: this.userApi.getCurrentId()}})
        };

其中this.category.find返回类型为Observable<T[]>

我用:

调用getCategories()
const source = this.categoryService.getCategories();
const example = source.map(Categ=> Categ.id);
const subscribe = example.subscribe(val => console.log(val));

和Categ.id是未定义

如果我跑:

const source = this.categoryService.getCategories();
const subscribe = source.subscribe(val => console.log(val));

直接输出: enter image description here

我认为我在某个地方遇到类型问题,但无法弄明白。

有什么想法吗?

谢谢和问候,

3 个答案:

答案 0 :(得分:1)

由于getCategories()返回了一个类别数组,而不仅仅是一个类别,正如您订阅的控制台日志所证明的那样。

您可以尝试以下方式:

const example = source.map((categories) => categories.map((category) => {return category.id}));

答案 1 :(得分:1)

问题确实在于类型。你应该尽可能避免使用“any”,因为那样你就失去了类型验证的优势。

从日志中可以看出source包含一个数组,但您的source.map(Categ=> Categ.id)将其视为单个对象。

最好定义Categ接口,例如:

interface Categ {
    id: string;
    categoryName: string;
    clientId: string;
}

然后将其用于服务方法:

getCategories(): Observable<Categ[]> {
     return this.category.find({where: {clientId: this.userApi.getCurrentId()}})
};

以后编译器可以帮助您发现问题并修复代码:

const source = this.categoryService.getCategories();
const example = source.map(categ => categ.map(c => c.id));
const subscribe = example.subscribe(val => console.log(val));

答案 2 :(得分:0)

正在编写一个界面&#34;太多&#34;? 我的.find()方法来自SDK并返回Observable<T[]>。此外,我正在服务,因为我想从后端获取数据并从组件中调用此服务。我不知道这项服务是否有用,因为只有这个 getCategories()方法。 为了简化,我已经有了一个方法,可以为我提供类别。我刚创建了一个新服务器来设置它。 那么创建一个界面太多了吗?你觉得怎么样?