2016-09-05 16 views
2

Вот мой магазин:Angular2 NgRx.Store и извлекая селекторы для повторного использования

{ 
    comments:{ 
    entities:{id:comment} 
    ids:[ids...] 
    }, 
    videos:{ 
    entities:{id:video} 
    ids:[ids...] 
    } 
} 

Вот мои прогнозы:

export function getVideoById(id) { 
    return (state$: Observable<AppState>) => _getVideoById(s, id); 
} 

function _getVideoById(s: AppState, id: string) { 
    return s.videos.entities[id]; 
} 

export function getCommentsByVideoId(id) { 
    return (state$: Observable<AppState>) => 
    state$.map((s: AppState) => _getCommentsByVideoId(s, id)) 
} 

function _getCommentsByVideoId(s: AppState, id) { 
    let currentVid = _getVideoById(s, id); 
    return currentVid.commentIds.map(id => s.comments.entities[id]); 
} 

А вот как получить доступ к данным с помощью выступы:

this.video$ = this.store.let(getVideoById(this.videoId)); 
this.comments$ = this.store.let(getCommentsByVideoId(this.videoId)); 

Мой вопрос:

я в настоящее время отделения в 2-х штук мои проекции, так что я могу повторно использовать некоторые части в других проекциях (ie: let currentVid = _getVideoById(s, id);).

Есть ли способ, который я могу объявить мои проекции в один блок и использовать их в других проекциях?

Вид проекционной композиции?

Я видел примеры этого, но каждый раз, когда они «уменьшают» «узкую» область проекции (то есть: мы начинаем с видео, и мы глубже погружаемся в видео, мы никогда не сможем вернуться к другим ветвям как «комментарии»). Я новичок во всем этом, поэтому некоторые советы будут очень признательны,

Спасибо.

+0

вы смотрели на [сложенных селекторов] (https://github.com/ngrx/example-app/blob/master/src/ редукторы/index.ts # L101-L125) в руководстве 'ngrx/example-app' для руководства? – cartant

+0

Да, я посмотрел на него некоторое время назад (спасибо), и я нашел это довольно сложным, поэтому я придумал решение выше ... – Brett

ответ

0

я придумал своего родом декоратор службы (до сих пор не уверен, если это «правильный путь») Примера:

@Injectable() 
export class MyFeatureState { 
    // Inject Store to Construtor 

    get allFeatureProperties() { 
     return this.store.select(s => s.feature.properties).map(toArray) 
    } 

    getFeaturePropertyById(id:string) { 
     return this.store.select(s => s.feature.properties[id])   
    } 

    get activeFeatureProperty() { 
     return Observable.combineLatest(
      this.allFeatureProperties, 
      this.store.select(s => s.feature.activeProperty) 
     ).map(([ap, active] => ap[active]) 
    } 
} 

interface FeatureState { 
    properties:{[id:string]:FeatureProperty}; 
    activeProperty:string; 
} 

Надежда года могут получить свой подход :) Вы также можете utilies некоторых функциональных возможностей memoize кэшировать наблюдаемыми (они будут по-прежнему выделяют новые значения)

Br