Ver código fonte

get triggering working

Adam Shaw 7 anos atrás
pai
commit
8c239f5ff9
5 arquivos alterados com 82 adições e 111 exclusões
  1. 26 4
      src/Calendar.ts
  2. 5 44
      src/View.ts
  3. 2 2
      src/basic/DayGrid.ts
  4. 2 2
      src/common/EmitterMixin.ts
  5. 47 59
      src/component/DateComponent.ts

+ 26 - 4
src/Calendar.ts

@@ -80,6 +80,7 @@ export default class Calendar {
   rerenderFlags: RenderForceFlags
   buildDelayedRerender: any
   delayedRerender: any
+  afterSizingTriggers: any = {}
 
 
   constructor(el: HTMLElement, overrides: OptionsInput) {
@@ -392,6 +393,7 @@ export default class Calendar {
     ) {
       this._render(this.rerenderFlags)
       this.rerenderFlags = null
+      this.releaseAfterSizingTriggers()
     }
   }
 
@@ -480,10 +482,16 @@ export default class Calendar {
   // -----------------------------------------------------------------------------------------------------------------
 
 
+  hasPublicHandlers(name: string): boolean {
+    return this.hasHandlers(name) ||
+      this.opt(name) // handler specified in options
+  }
+
+
   publiclyTrigger(name: string, args) {
     let optHandler = this.opt(name)
 
-    this.triggerWith(name, this, args) // Emitter's method
+    this.triggerWith(name, this, args)
 
     if (optHandler) {
       return optHandler.apply(this, args)
@@ -491,9 +499,23 @@ export default class Calendar {
   }
 
 
-  hasPublicHandlers(name: string): boolean {
-    return this.hasHandlers(name) ||
-      this.opt(name) // handler specified in options
+  publiclyTriggerAfterSizing(name, args) {
+    let { afterSizingTriggers } = this;
+
+    (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args)
+  }
+
+
+  releaseAfterSizingTriggers() {
+    let { afterSizingTriggers } = this
+
+    for (let name in afterSizingTriggers) {
+      for (let args of afterSizingTriggers[name]) {
+        this.publiclyTrigger(name, args)
+      }
+    }
+
+    this.afterSizingTriggers = {}
   }
 
 

+ 5 - 44
src/View.ts

@@ -193,35 +193,20 @@ export default abstract class View extends InteractiveDateComponent {
     super.renderDates()
     this.addScroll({ isDateInit: true })
     this.startNowIndicator() // shouldn't render yet because updateSize will be called soon
+    this.triggerRenderedDates()
   }
 
 
   unrenderDates() {
+    this.triggerWillRemoveDates()
     this.unselect()
     this.stopNowIndicator()
     super.unrenderDates()
   }
 
 
-  // Triggering
-  // -----------------------------------------------------------------------------------------------------------------
-
-
-  bindBaseRenderHandlers() {
-    this.on('datesRendered', () => {
-      this.whenSizeUpdated(
-        this.triggerViewRender
-      )
-    })
-
-    this.on('before:datesUnrendered', () => {
-      this.triggerViewDestroy()
-    })
-  }
-
-
-  triggerViewRender() {
-    this.publiclyTrigger('viewRender', [
+  triggerRenderedDates() {
+    this.publiclyTriggerAfterSizing('viewRender', [
       {
         view: this,
         el: this.el
@@ -230,7 +215,7 @@ export default abstract class View extends InteractiveDateComponent {
   }
 
 
-  triggerViewDestroy() {
+  triggerWillRemoveDates() {
     this.publiclyTrigger('viewDestroy', [
       {
         view: this,
@@ -535,30 +520,6 @@ export default abstract class View extends InteractiveDateComponent {
   }
 
 
-  /* Triggers
-  ------------------------------------------------------------------------------------------------------------------*/
-
-
-  triggerBaseRendered() {
-    this.publiclyTrigger('viewRender', [
-      {
-        view: this,
-        el: this.el
-      }
-    ])
-  }
-
-
-  triggerBaseUnrendered() {
-    this.publiclyTrigger('viewDestroy', [
-      {
-        view: this,
-        el: this.el
-      }
-    ])
-  }
-
-
   /* Date Utils
   ------------------------------------------------------------------------------------------------------------------*/
 

+ 2 - 2
src/basic/DayGrid.ts

@@ -605,7 +605,7 @@ export default class DayGrid extends InteractiveDateComponent {
         // kill everything when the popover is hidden
         // notify events to be removed
         if (this.popoverSegs) {
-          this.triggerBeforeEventSegsDestroyed(this.popoverSegs)
+          this.triggerWillRemoveSegs(this.popoverSegs)
         }
         this.segPopover.removeElement()
         this.segPopover = null
@@ -628,7 +628,7 @@ export default class DayGrid extends InteractiveDateComponent {
     // delegated-handlers for free. attach event-related handlers to the popover.
     this.bindAllSegHandlersToEl(this.segPopover.el)
 
-    this.triggerAfterEventSegsRendered(segs)
+    this.triggerRenderedSegs(segs)
   }
 
 

+ 2 - 2
src/common/EmitterMixin.ts

@@ -19,8 +19,8 @@ export interface EmitterInterface {
   on(types, handler)
   one(types, handler)
   off(types, handler)
-  trigger(types, ...args)
-  triggerWith(types, context, args)
+  trigger(type, ...args)
+  triggerWith(type, context, args)
   hasHandlers(type)
 }
 

+ 47 - 59
src/component/DateComponent.ts

@@ -141,17 +141,58 @@ export default abstract class DateComponent extends Component {
   }
 
 
-  publiclyTrigger(...args) {
+  // Triggering
+  // -----------------------------------------------------------------------------------------------------------------
+
+
+  publiclyTrigger(name, args) {
+    let calendar = this.getCalendar()
+
+    return calendar.publiclyTrigger(name, args)
+  }
+
+
+  publiclyTriggerAfterSizing(name, args) {
     let calendar = this.getCalendar()
 
-    return calendar.publiclyTrigger.apply(calendar, args)
+    return calendar.publiclyTriggerAfterSizing(name, args)
   }
 
 
-  hasPublicHandlers(...args) {
+  hasPublicHandlers(name) {
     let calendar = this.getCalendar()
 
-    return calendar.hasPublicHandlers.apply(calendar, args)
+    return calendar.hasPublicHandlers(name)
+  }
+
+
+  triggerRenderedSegs(segs: Seg[]) {
+    if (this.hasPublicHandlers('eventAfterRender')) {
+      for (let seg of segs) {
+        this.publiclyTriggerAfterSizing('eventAfterRender', [
+          {
+            event: seg.eventRange, // what to do here?
+            el: seg.el,
+            view: this
+          }
+        ])
+      }
+    }
+  }
+
+
+  triggerWillRemoveSegs(segs: Seg[]) {
+    if (this.hasPublicHandlers('eventDestroy')) {
+      for (let seg of segs) {
+        this.publiclyTrigger('eventDestroy', [
+          {
+            event: seg.eventRange, // what to do here?
+            el: seg.el,
+            view: this
+          }
+        ])
+      }
+    }
   }
 
 
@@ -399,12 +440,14 @@ export default abstract class DateComponent extends Component {
       this.eventRenderer.renderSegs(
         this.eventStoreToSegs(eventStore)
       )
+      this.triggerRenderedSegs(this.eventRenderer.getSegs())
     }
   }
 
 
   unrenderEvents() {
     if (this.eventRenderer) {
+      this.triggerWillRemoveSegs(this.eventRenderer.getSegs())
       this.eventRenderer.unrender()
     }
   }
@@ -430,61 +473,6 @@ export default abstract class DateComponent extends Component {
   }
 
 
-  // Event Rendering Triggering
-  // -----------------------------------------------------------------------------------------------------------------
-
-
-  triggerAfterEventsRendered() {
-    this.triggerAfterEventSegsRendered(
-      this.getEventSegs()
-    )
-
-    this.publiclyTrigger('eventAfterAllRender', [ { view: this } ])
-  }
-
-
-  triggerAfterEventSegsRendered(segs) {
-    // an optimization, because getEventLegacy is expensive
-    if (this.hasPublicHandlers('eventAfterRender')) {
-      segs.forEach((seg) => {
-        if (seg.el) { // necessary?
-          this.publiclyTrigger('eventAfterRender', [
-            {
-              event: seg.eventRange, // what to do here?
-              el: seg.el,
-              view: this
-            }
-          ])
-        }
-      })
-    }
-  }
-
-
-  triggerBeforeEventsDestroyed() {
-    this.triggerBeforeEventSegsDestroyed(
-      this.getEventSegs()
-    )
-  }
-
-
-  triggerBeforeEventSegsDestroyed(segs) {
-    if (this.hasPublicHandlers('eventDestroy')) {
-      segs.forEach((seg) => {
-        if (seg.el) { // necessary?
-          this.publiclyTrigger('eventDestroy', [
-            {
-              event: seg.eventRange, // what to do here?
-              el: seg.el,
-              view: this
-            }
-          ])
-        }
-      })
-    }
-  }
-
-
   // Event Rendering Utils
   // -----------------------------------------------------------------------------------------------------------------