2017-01-08 1 views
0

Я работаю в приложении Angular 2.3, используя ngrx/store + шаблон сокращения.Неопределенные ошибки, сгенерированные с помощью коммутационной карты rxjs, используемой с фильтром (Angular 2 + ngrx/store + redux)

При вытягивании списка объектов из моего магазина (то есть большого изображения в верхней части страницы), я получаю неопределенную ошибку, которую пытаюсь устранить. Похоже, это может быть состояние гонки, когда функция разрешается до наблюдаемого. В любом случае, я все еще получаю результат, но при попытке понять ошибку:

error_handler.js:50 EXCEPTION: Cannot read property 'filter' of undefined 
TypeError: Cannot read property 'filter' of undefined 

Я имею в конструкторе (который имеет private _store: Store)

objects$: Observable<Object[]> = _store.select(s => s.objects) 

и моя функция:

selectObject(id: number): Observable<Object> { 
    return this.objects$ 
     .switchMap(objects => objects.filter(object => object.id === id)); 
} 
+0

Это может быть ошибка TypeScript. Если 'objects' является массивом, попробуйте' objects $: Observable = _store.select (s => s.objects) ' –

+0

Я добавил ответ об ошибке, упомянутой в вашем вопросе, но почему вы используете' оператор switchMap'? 'switchMap' объединяет наблюдаемый, но вы, кажется, возвращаете массив. – cartant

+0

@cartant using switchMap, потому что я возвращаю наблюдаемый (содержащий массив) из магазина. Все новые данные поступают в магазин через редуктор, отправляющий полезную нагрузку (в этом случае массив объектов генерирует новое состояние), и из магазина я получаю наблюдаемое из последнего состояния. – Vijay

ответ

0

Наиболее вероятным объяснением является то, что состояние не содержит имущества objects (или имущество undefined в исходном состоянии) и что ваш select оператор затем испускать undefined:

_store.select(s => s.objects) 

Там нет никакого упоминания в вашем вопросе о структуре государства, так что не намного больше, чтобы сказать.

Чтобы подтвердить, что это проблема, вы можете добавить протоколирование к селектору:

_store.select(s => { console.log(`objects = ${s.objects}`); return s.objects; }) 
0

Спасибо за предложения. Проблема не удивительно закончилась тем, что я вызывал функцию вверх по течению, где у меня было условие, которое вызывало его до того, как оно было заполнено, но затем снова вызвало его после того, как оно было заселено, следовательно, оно сработало, но появилось сообщение об ошибке.

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