WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 8c73753

Browse files
committed
Rewritten several binding handlers into behaviors.
1 parent fff8bf8 commit 8c73753

File tree

2 files changed

+10
-79
lines changed

2 files changed

+10
-79
lines changed

src/ko/bindingHandlers/bindingHandlers.collapse.ts

Lines changed: 5 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,17 @@
11
import * as ko from "knockout";
2-
import { Keys, MouseButtons } from "@paperbits/common";
3-
import { Events } from "@paperbits/common/events";
2+
import { CollapseBehavior } from "@paperbits/common/behaviors/collapseBehavior";
43

54
ko.bindingHandlers["collapse"] = {
65
init: (triggerElement: HTMLElement, valueAccessor) => {
76
// timeout to let other bindings to bind id for collapsable container
8-
9-
const expanded: boolean = true;
10-
117
setTimeout(() => {
128
const targetSelector = ko.unwrap(valueAccessor());
13-
const targetElement = document.querySelector(targetSelector);
14-
15-
if (!targetElement) {
16-
return;
17-
}
18-
19-
const visibleObservable = ko.observable(expanded);
20-
21-
if (!triggerElement.hasAttribute("aria-label")) {
22-
triggerElement.setAttribute("aria-label", "Toggle section");
23-
}
24-
25-
triggerElement.setAttribute("role", "button");
26-
triggerElement.setAttribute("aria-expanded", expanded.toString());
27-
28-
targetElement.setAttribute("role", "region");
29-
targetElement.setAttribute("aria-hidden", (!expanded).toString());
30-
31-
const toggle = (): void => {
32-
const newValue = !visibleObservable();
33-
visibleObservable(newValue);
34-
triggerElement.setAttribute("aria-expanded", newValue.toString());
35-
36-
if (!targetElement) {
37-
return;
38-
}
39-
40-
targetElement.setAttribute("aria-hidden", (!newValue).toString());
41-
};
42-
43-
const onPointerDown = (event: MouseEvent): void => {
44-
if (event.button !== MouseButtons.Main) {
45-
return;
46-
}
47-
toggle();
48-
};
49-
50-
const onClick = (event: MouseEvent): void => {
51-
event.preventDefault();
52-
event.stopImmediatePropagation();
53-
};
54-
55-
const onKeyDown = (event: KeyboardEvent): void => {
56-
if (event.key === Keys.Enter || event.key === Keys.Space) {
57-
toggle();
58-
}
59-
};
60-
61-
triggerElement.addEventListener(Events.Click, onClick);
62-
triggerElement.addEventListener(Events.KeyDown, onKeyDown);
63-
triggerElement.addEventListener(Events.MouseDown, onPointerDown);
64-
65-
ko.applyBindingsToNode(targetElement, {
66-
css: { collapsed: ko.pureComputed(() => !visibleObservable()) }
67-
}, null);
68-
69-
ko.applyBindingsToNode(triggerElement, {
70-
css: { collapsed: ko.pureComputed(() => !visibleObservable()) }
71-
}, null);
9+
const behaviorHandle = CollapseBehavior.attach(triggerElement, targetSelector);
7210

7311
ko.utils.domNodeDisposal.addDisposeCallback(triggerElement, () => {
74-
triggerElement.removeEventListener(Events.Click, onClick);
75-
triggerElement.removeEventListener(Events.KeyDown, onKeyDown);
76-
triggerElement.removeEventListener(Events.MouseDown, onPointerDown);
12+
if (behaviorHandle && behaviorHandle.detach) {
13+
behaviorHandle.detach();
14+
}
7715
});
7816
}, 100);
7917
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
import * as ko from "knockout";
2+
import { WhenInViewBehavior } from "@paperbits/common/behaviors/whenInViewBehavior";
23

34
ko.bindingHandlers["whenInView"] = {
45
init: (element: HTMLElement, valueAccessor) => {
56
const callback = valueAccessor();
6-
7-
const onIntersect = (entries) => {
8-
entries.forEach(entry => {
9-
if (entry.isIntersecting && callback) {
10-
callback();
11-
}
12-
});
13-
};
14-
15-
const observer = new IntersectionObserver(onIntersect);
16-
observer.observe(element);
7+
const behaviorHandle = WhenInViewBehavior.attach(element, callback);
178

189
ko.utils.domNodeDisposal.addDisposeCallback(element, () => {
19-
observer.disconnect();
10+
if (behaviorHandle && behaviorHandle.detach) {
11+
behaviorHandle.detach();
12+
}
2013
});
2114
}
2215
};

0 commit comments

Comments
 (0)