2016-12-21 6 views
0

ich eine Toggle-Button und einen Kalender habe, die enter image description herebeobachtbaren Aktivieren wieder nach abmelden

wie aussieht Wie man auf dem Bild sehen kann, ist die edit eine umschaltbare Schaltfläche und wenn er gedrückt wurde, dann wird der Kalender bearbeitbar sein.

Die Edit Toggle-Button ist so heiß beobachtbar definiert:

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

Auch das select-Ereignis auf dem Kalender:

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

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

Wenn der Umschaltknopf wurde gedrückt, dann schaltet er beobachtbar Kalender. Um zu klären folgende Code-Schnipsel zu berücksichtigen:

_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(); 
     }); 

    }, 

Nach dem Einschalten beobachtbar Kalender, dann wird der Kalender bearbeitet werden für immer, auch wenn ich auf den Schalter drücken Sie die edit-Modus zu deaktivieren.

Ich habe versucht, den Kalender auswählen beobachtbaren abzumelden:

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

Aber dann wird der Kalender wählen gestreamt werden nicht mehr nach wieder die edit-Modus aktivieren.

+0

Also, im Grunde, müssen Sie emiting stammt aus dem '_processCalenderSelect' zu stoppen, wenn' oEditOb' wird zweites Mal angeklickt? –

+0

Wie kann ich das tun, um mit dem Aussenden aufzuhören? –

Antwort

2

Versuchen zu verwenden 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

Es funktioniert wie ein Charme, dank viel Sergey. –

Verwandte Themen