2017-02-07 6 views
1

У меня есть функция:Как получить доступ к отдельным наблюдаемым элементам?

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

Я думаю, что у меня проблема типа, но не могу понять.

Любая идея?

Спасибо и наилучшие пожелания,

+0

Вы действительно уверены, что this.category.find возвращает Observable? –

+0

Да, это как ** console.log (исходный экземпляр Observable); ** is true –

ответ

1

Проблема действительно с типами. Вы должны избегать использования «любого», когда это возможно, потому что тогда вы теряете преимущество проверки типа.

Из журнала видно, что 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)); 
+0

Спасибо. Фактически я решил это с помощью: ** const example = source.map ((categories) => categories.map ((category) => {return category.id})); ** –

1

Как массив категорий возвращаются в getCategories(), а не только одной категории, о чем свидетельствуют подписываться зайдет вашей консоль.

Вы могли бы попробовать что-то вроде:

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

Написал интерфейс что-то «слишком много»? Мой метод .find() поступает из SDK и возвращает Observable<T[]>. Кроме того, я нахожусь в службе, потому что я хотел бы получить данные из внутреннего сервера и вызвать эту службу из компонента. Я понятия не имею, имеет ли этот сервис использование только этого метода getCategories(). Чтобы упростить, у меня уже есть метод, который дает мне категории. Я только что создал новый, чтобы установить его в службе. Значит, слишком много создается интерфейс? Как вы думаете?

Смежные вопросы