Skip to content

Commit e53a05d

Browse files
authored
fix(v-b-modal): only unbind/rebind if trigger element or modal ID changes (closes bootstrap-vue#4669) (bootstrap-vue#4672)
1 parent 3a3ee1d commit e53a05d

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

src/directives/modal/modal.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { keys } from '../../utils/object'
1616
const EVENT_SHOW = 'bv::show::modal'
1717

1818
// Prop name we use to store info on root element
19-
const HANDLER = '__bv_modal_directive__'
19+
const PROPERTY = '__bv_modal_directive__'
2020

2121
const EVENT_OPTS = { passive: true }
2222

@@ -64,7 +64,7 @@ const bind = (el, binding, vnode) => {
6464
}
6565
}
6666
}
67-
el[HANDLER] = handler
67+
el[PROPERTY] = { handler, target, trigger }
6868
// If element is not a button, we add `role="button"` for accessibility
6969
setRole(trigger)
7070
// Listen for click events
@@ -78,19 +78,30 @@ const bind = (el, binding, vnode) => {
7878
}
7979

8080
const unbind = el => {
81-
const trigger = getTriggerElement(el)
82-
const handler = el ? el[HANDLER] : null
81+
const oldProp = el[PROPERTY] || {}
82+
const trigger = oldProp.trigger
83+
const handler = oldProp.handler
8384
if (trigger && handler) {
8485
eventOff(trigger, 'click', handler, EVENT_OPTS)
8586
eventOff(trigger, 'keydown', handler, EVENT_OPTS)
87+
eventOff(el, 'click', handler, EVENT_OPTS)
88+
eventOff(el, 'keydown', handler, EVENT_OPTS)
8689
}
87-
delete el[HANDLER]
90+
delete el[PROPERTY]
8891
}
8992

9093
const componentUpdated = (el, binding, vnode) => {
91-
// We bind and rebind just in case target changes
92-
unbind(el, binding, vnode)
93-
bind(el, binding, vnode)
94+
const oldProp = el[PROPERTY] || {}
95+
const target = getTarget(binding)
96+
const trigger = getTriggerElement(el)
97+
if (target !== oldProp.target || trigger !== oldProp.trigger) {
98+
// We bind and rebind if the target or trigger changes
99+
unbind(el, binding, vnode)
100+
bind(el, binding, vnode)
101+
}
102+
// If trigger element is not a button, ensure `role="button"`
103+
// is still set for accessibility
104+
setRole(trigger)
94105
}
95106

96107
const updated = () => {}

0 commit comments

Comments
 (0)