2016-12-21 3 views
0

У меня есть кнопка переключения и календарь, который выглядит как enter image description hereАктивировать наблюдаемой снова после отказа от подписки

Как вы можете видеть на изображении, edit это кнопка-переключатель, когда он получил нажат, то календарь будет быть редактируемым.

Кнопка редактирования переключения определяется как горячий наблюдаемым:

let oEditOb = this._createEditObservable(this.getById("cal-edit")); 
_createEditObservable: function (oEditBtn) { 
     return Rx.Observable.create(function (subscriber) { 
     oEditBtn.attachPress(function (oEvent) { 
      subscriber.next(oEvent); 
     }); 
     }); 
    }, 

Также выберите событие в календаре:

let oCalendarSelectOb = this._createCalendarSelectObservable(this.getById("calendar-view")); 

    _createCalendarSelectObservable: function (oCalendar) { 
     return Rx.Observable.create(function (subscriber) { 
     oCalendar.attachSelect(function (oEvent) { 
      subscriber.next(oEvent); 
     }) 
     }); 
    }, 

Когда кнопка переключения получил нажата, то он переключится на календарь наблюдаемым. Для уточнения рассмотрит следующий фрагмент кода:

_processCalenderSelect: function (oCalendarSelectOb, oEditButtonOb) { 
     let self = this; 

     return oEditButtonOb 
     .filter(function (oBtn) { 
      return oBtn.getPressed(); 
     }) 
     .switchMapTo(oCalendarSelectOb) 
     .mergeMap(function (oCalendar) { 
      return Rx.Observable.from(oCalendar.getSource().getSelectedDates()); 
     }) 
     .map(function (oDateRange) { 
      return oDateRange.getStartDate(); 
     }); 

    }, 

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

Я попытался отказаться календарь выбора наблюдаемым:

oEditPressedOb.subscribe(function (oSource) { 
     if(!oSource.getPressed()){ 
      oSubscription.unsubscribe(); 
     } 
     console.log(oSource); 
     }); 

Но тогда календарь выбрать будет не потоковом больше после включения режима edit снова.

+0

Так, в принципе, вам нужно остановить непосредственно излучающих даты от '' _processCalenderSelect' когда oEditOb' нажата второй раз? –

+0

Как я могу это сделать, чтобы прекратить излучать? –

ответ

2

Попробуйте использовать combineLatest:

_processCalenderSelect: function (oCalendarSelectOb, oEditButtonOb) { 
    let self = this; 

    let selectedDates = oCalendarSelectOb 
    .mergeMap(function (oCalendar) { 
     return Rx.Observable.from(oCalendar.getSource().getSelectedDates()); 
    }) 
    .map(function (oDateRange) { 
     return oDateRange.getStartDate(); 
    }); 

    return Rx.Observable 
    .combineLatest(
     oEditButtonOb.map(function (oBtn) { 
     return oBtn.getPressed(); 
     }), 
     selectedDates 
    ) 
    .filter(function (input) { 
     return input[0]; 
    }) 
    .map(function (input) { 
     return input[1]; 
    }); 
}, 
+0

Это работает как шарм, благодаря большому количеству Сергея. –