2016-11-16 5 views
0

Наблюдаемый this.currentNodeFilters$ определяется в ngOnChanged, поскольку он использует Input() (this.node), вытолкнутый из родительского компонента, с использованием ChangeDetectionStrategy.OnPush (неизменяемый объект).Почему это наблюдаемое не реагирует?

Этот this.currentNodeFilters$ используется с текущим queryParams в combineLatest. Я ожидаю, что при любых изменениях от this.currentNodeFilters$ или queryParams наблюдаемый this.currentFilters$ отреагирует. Но ничего не происходит.

Вопрос: Почему это не реагирует на изменения?

Вот мой код:

import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; 
import {ActivatedRoute} from "@angular/router"; 
import {Observable} from "rxjs"; 

@Component({ 
    selector: 'filter-content', 
    templateUrl: './filter-content.component.html', 
    styleUrls: ['./filter-content.component.scss'], 
    changeDetection: ChangeDetectionStrategy.OnPush 
}) 
export class FilterContentComponent implements OnInit { 

    public currentNodeFilters$: Observable<any>; 
    public currentFilters:any; 

    @Input() node; 

    constructor(private route: ActivatedRoute) { } 

    ngOnChanges() { 
    this.currentNodeFilters$ = Observable.of({ 
     "params": { 
      "nodes": this.node.id 
     }, 
     "order": "asc" 
     } 
    ) 
    } 

    ngOnInit() { 
    const queryParams$ = this.route.queryParams; 

    // On regarde les queryParams pour construire currentFilters 
    Observable.combineLatest(this.currentNodeFilters$, queryParams$, (currentFilter, queryParams) => { 
     const p = Object.keys(queryParams).map(key => { 
      const params = {}; 
      params[key] = queryParams[key]; 
      return Object.assign({}, {"params": params}) 
     }) 

     return Object.assign({}, currentFilter, p); 
     }) 
     .subscribe(currentFilters => this.currentFilters = currentFilters) 

    } 
} 

И файл HML подписавшись

node: {{node | json}} from filter-content<br> 
currentNodeFilters$: {{currentNodeFilters$ | async | json}}<br> 
currentFilters: {{currentFilters | json}} 
+1

Вы подписались на наблюдаемый? –

+0

Да в html. Я собираюсь изменить сообщение, чтобы добавить его. – Tom

+1

В моей книге combLatest принимает два наблюдаемых в качестве аргумента и функцию, которая объединяет их события. map() принимает функцию, принимающую событие, а не два значения. –

ответ

1

Основная проблема, которую я вижу, что ваши Переосмысление currentNodeFilters $ наблюдаемым на каждом ngOnChanges. Хотя вместо этого вы должны подталкивать новое значение через наблюдаемое каждый раз, когда вы вызываете метод ngOnChanges. Вместо этого вы должны использовать тему, если хотите сделать что-то вроде этого. Ваш код будет выглядеть так:

// Create a subject instead of an observable 
public currentNodeFilters$: Subject<any> = new Subject(); 
public currentFilters:any; 

@Input() node; 

constructor(private route: ActivatedRoute) { } 

ngOnChanges() { 
    // next the value through the subject 
    this.currentNodeFilters$.next{ 
     "params": { 
      "nodes": this.node.id 
     }, 
     "order": "asc" 
     } 
    ) 
    } 
+0

Это было, спасибо.). Я предполагаю, что это объясняет некоторые из проблем, которые у меня есть с RxJS. – Tom

+0

Вы должны увидеть разницу между наблюдаемым и субъектом как: субъект - это то место, где вы являетесь производителем ценностей, наблюдаемый - это где-то еще (будучи угловатым, Сам RxJS, ...) является производителем и определяет значения. – KwintenP

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

  • Нет связанных вопросов^_^