2017-01-19 8 views
3

У меня есть простая проблема, которую не так легко разрешить, я выяснил, я пытаюсь сделать подписку не огонь, если ни одно из двух значений sorting.changes и pagination.changes не изменилось. Я предполагаю, что distinctUntilChanged следует использовать, однако я не могу понять, что нужно предоставить в качестве аргументов, так как у меня есть два значения, которые нужно проверить вместо одного.Угловая 2 как предотвратить подписку на обжиг, если ни одно из двух значений, возвращаемых картой, не изменилось

EDIT (правильный подписываться называют этот раз): Вот подписывается по телефону:

this.requestParamsSubscription = this.store.select('brands') 
    .distinctUntilChanged() 
    .map((brands: IBrandsStorage) => { 
    return {sorting: brands.sorting, pagination: brands.pagination}; 
    }) 
    .subscribe(
    params => { 
     this.store.dispatch({type: BrandsActions.GET_BRANDS_REQUEST}); 
    } 
); 

changes объектов является простым числовым счетчиком, который отслеживает изменения, я полагал, что я мог бы использовать это проверьте, изменились ли объекты с последнего раза.

Есть идеи?

+0

Изменение в названии не согласуется с текстом вопроса: «если два значения всех и всего не изменились». Я не против изменения ответа, но вопрос также должен быть изменен: «если только * ни один из * не изменил значения всех * или * томов». – cartant

+0

Отредактировано, чтобы сообщать об этом. – Chrillewoodz

ответ

2

distinctUntilChanged можно передать функцию сравнения (которая должна возвращать true, если аргументы не изменяются). Если какая-либо all или total должны быть изменены, вы можете использовать:

this.brandsStorageSubscription = this.store.select('brands') 
    .map((brands: IBrandsStorage) => ({ all: brands.all, total: brands.total })) 
    .distinctUntilChanged((a, b) => (a.all === b.all) && (a.total === b.total)) 
    .subscribe(
    brands => { 
     console.log(brands); 
     this.total = brands.total; 
     this.brands = brands.all; 
    } 
); 
+0

Хм, похоже, он не работает. Я случайно отправил неправильный вызов подписки, но в моем другом «все» и «total» есть оба объекта, содержащие некоторые свойства, а также другой объект в качестве одного из этих свойств. Все еще работает, чтобы сравнить их с '===' для глубоких объектов? – Chrillewoodz

+0

Нет. Вам нужно будет предоставить реализацию, которая возвращает 'true', если вы считаете, что изменений не будет. Тебе решать. – cartant

+0

Хорошо, я попробую. – Chrillewoodz