Skip to content

Commit 5b6fb3b

Browse files
authored
feat(registerBootstrapBlazorModule ): add registerBootstrapBlazorModule in utility (#5487)
* refactor: 增强 deepMerge 功能 * refactor: 增加 registerBootstrapBlazorModule 方法 * refactor: 精简代码 * refactor: 增加返回值减少代码 * refactor: 精简代码 * refactor: 精简代码
1 parent 291eb63 commit 5b6fb3b

2 files changed

Lines changed: 47 additions & 49 deletions

File tree

src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.js

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
import { debounce } from "../../modules/utility.js"
1+
import { debounce, registerBootstrapBlazorModule } from "../../modules/utility.js"
22
import { handleKeyUp, select, selectAllByFocus, selectAllByEnter } from "../Input/BootstrapInput.razor.js"
33
import Data from "../../modules/data.js"
44
import EventHandler from "../../modules/event-handler.js"
55
import Input from "../../modules/input.js"
66
import Popover from "../../modules/base-popover.js"
77

8-
if (window.BootstrapBlazor === void 0) {
9-
window.BootstrapBlazor = {};
10-
}
11-
128
export function init(id, invoke) {
139
const el = document.getElementById(id)
1410
const menu = el.querySelector('.dropdown-menu')
@@ -76,32 +72,29 @@ export function init(id, invoke) {
7672
filterCallback(v);
7773
});
7874

79-
if (window.BootstrapBlazor.AutoComplete === void 0) {
80-
window.BootstrapBlazor.AutoComplete = {
81-
hooked: false,
82-
registerCloseDropdownHandler: function () {
83-
if (this.hooked === false) {
84-
this.hooked = true;
85-
86-
EventHandler.on(document, 'click', e => {
87-
[...document.querySelectorAll('.auto-complete.show')].forEach(a => {
88-
const ac = e.target.closest('.auto-complete');
89-
if (ac === a) {
90-
return;
91-
}
92-
93-
const el = a.querySelector('[data-bs-toggle="bb.dropdown"]');
94-
if (el === null) {
95-
a.classList.remove('show');
96-
}
97-
});
75+
const module = registerBootstrapBlazorModule('AutoComplete', {
76+
hooked: false,
77+
registerCloseDropdownHandler: function () {
78+
if (this.hooked === false) {
79+
this.hooked = true;
80+
81+
EventHandler.on(document, 'click', e => {
82+
[...document.querySelectorAll('.auto-complete.show')].forEach(a => {
83+
const ac = e.target.closest('.auto-complete');
84+
if (ac === a) {
85+
return;
86+
}
87+
88+
const el = a.querySelector('[data-bs-toggle="bb.dropdown"]');
89+
if (el === null) {
90+
a.classList.remove('show');
91+
}
9892
});
99-
}
93+
});
10094
}
10195
}
102-
}
103-
104-
window.BootstrapBlazor.AutoComplete.registerCloseDropdownHandler();
96+
});
97+
module.registerCloseDropdownHandler();
10598
}
10699

107100
const handlerKeyup = (ac, e) => {

src/BootstrapBlazor/wwwroot/modules/utility.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -571,28 +571,23 @@ const hackPopover = (popover, css) => {
571571
}
572572

573573
const hackTooltip = function () {
574-
window.BootstrapBlazor ??= {};
575-
576-
if (window.BootstrapBlazor.Tooltip === void 0) {
577-
window.BootstrapBlazor.Tooltip = {
578-
hooked: false,
579-
hackDispose: function () {
580-
if (this.hooked === false) {
581-
this.hooked = true;
582-
583-
const originalDispose = bootstrap.Tooltip.prototype.dispose;
584-
bootstrap.Tooltip.prototype.dispose = function () {
585-
originalDispose.call(this);
586-
// fix https://github.com/twbs/bootstrap/issues/37474
587-
this._activeTrigger = {};
588-
this._element = document.createElement('noscript'); // placeholder with no behavior
589-
}
574+
const tooltip = registerBootstrapBlazorModule('Tooltip', {
575+
hooked: false,
576+
hackDispose: function () {
577+
if (this.hooked === false) {
578+
this.hooked = true;
579+
580+
const originalDispose = bootstrap.Tooltip.prototype.dispose;
581+
bootstrap.Tooltip.prototype.dispose = function () {
582+
originalDispose.call(this);
583+
// fix https://github.com/twbs/bootstrap/issues/37474
584+
this._activeTrigger = {};
585+
this._element = document.createElement('noscript'); // placeholder with no behavior
590586
}
591587
}
592588
}
593-
}
594-
595-
window.BootstrapBlazor.Tooltip.hackDispose();
589+
});
590+
tooltip.hackDispose();
596591
}
597592

598593
const setIndeterminate = (object, state) => {
@@ -802,20 +797,30 @@ export function switchTheme(theme, x = 0, y = 0, sync = true) {
802797
}
803798
}
804799

805-
const deepMerge = (obj1, obj2) => {
806-
for (let key in obj2) {
800+
const deepMerge = (obj1, obj2, skipNull = true) => {
801+
for (const key in obj2) {
807802
if (obj2.hasOwnProperty(key)) {
808803
if (obj2[key] instanceof Object && obj1[key] instanceof Object) {
809804
obj1[key] = deepMerge(obj1[key], obj2[key]);
810805
}
811806
else {
807+
const value = obj2[key];
808+
if (skipNull && value === null) {
809+
continue;
810+
}
812811
obj1[key] = obj2[key];
813812
}
814813
}
815814
}
816815
return obj1;
817816
}
818817

818+
export function registerBootstrapBlazorModule(name, module) {
819+
window.BootstrapBlazor ??= {};
820+
window.BootstrapBlazor[name] ??= deepMerge(window.BootstrapBlazor[name] ?? {}, module);
821+
return window.BootstrapBlazor[name];
822+
}
823+
819824
export function setTitle(title) {
820825
document.title = title;
821826
}

0 commit comments

Comments
 (0)