Skip to content

Commit 16820e4

Browse files
authored
feat: add support for angular two way data binding (#706)
The current commit enables components to implement the interface for Angular two way data binding & form support. Components that implement the interface: - Input - Checkbox - Datepicker - Switch
1 parent dd6c2a7 commit 16820e4

File tree

6 files changed

+40
-3
lines changed

6 files changed

+40
-3
lines changed

packages/base/src/UI5Element.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import boot from "./boot.js";
2-
import { getNoConflict } from "./config/NoConflict.js";
2+
import { skipOriginalEvent } from "./config/NoConflict.js";
33
import { getCompactSize } from "./config/CompactSize.js";
44
import DOMObserver from "./compatibility/DOMObserver.js";
55
import UI5ElementMetadata from "./UI5ElementMetadata.js";
@@ -522,7 +522,6 @@ class UI5Element extends HTMLElement {
522522
*/
523523
fireEvent(name, data, cancelable) {
524524
let compatEventResult = true; // Initialized to true, because if the event is not fired at all, it should be considered "not-prevented"
525-
const noConflict = getNoConflict();
526525

527526
const noConflictEvent = new CustomEvent(`ui5-${name}`, {
528527
detail: data,
@@ -534,7 +533,7 @@ class UI5Element extends HTMLElement {
534533
// This will be false if the compat event is prevented
535534
compatEventResult = this.dispatchEvent(noConflictEvent);
536535

537-
if (noConflict === true || (noConflict.events && noConflict.events.includes && noConflict.events.includes(name))) {
536+
if (skipOriginalEvent(name)) {
538537
return compatEventResult;
539538
}
540539

+28
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,44 @@
11
import { getNoConflict as getConfiguredNoConflict } from "../InitialConfiguration.js";
22

3+
// Fire these events even with noConflict: true
4+
const excludeList = [
5+
"value-changed",
6+
];
7+
8+
const shouldFireOriginalEvent = eventName => {
9+
return excludeList.includes(eventName);
10+
};
11+
312
let noConflict = getConfiguredNoConflict();
413

14+
const shouldNotFireOriginalEvent = eventName => {
15+
return !(noConflict.events && noConflict.events.includes && noConflict.events.includes(eventName));
16+
};
17+
518
const getNoConflict = () => {
619
return noConflict;
720
};
821

22+
const skipOriginalEvent = eventName => {
23+
// Always fire these events
24+
if (shouldFireOriginalEvent(eventName)) {
25+
return false;
26+
}
27+
28+
// Read from the configuration
29+
if (noConflict === true) {
30+
return true;
31+
}
32+
33+
return !shouldNotFireOriginalEvent(eventName);
34+
};
35+
936
const setNoConflict = noConflictData => {
1037
noConflict = noConflictData;
1138
};
1239

1340
export {
1441
getNoConflict,
1542
setNoConflict,
43+
skipOriginalEvent,
1644
};

packages/main/src/CheckBox.js

+2
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ class CheckBox extends UI5Element {
245245
if (this.canToggle()) {
246246
this.checked = !this.checked;
247247
this.fireEvent("change");
248+
// Angular two way data binding
249+
this.fireEvent("value-changed");
248250
}
249251
return this;
250252
}

packages/main/src/DatePicker.js

+4
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ class DatePicker extends UI5Element {
327327

328328
this.value = nextValue;
329329
this.fireEvent("change", { value: nextValue, valid: isValid });
330+
// Angular two way data binding
331+
this.fireEvent("value-changed", { value: nextValue, valid: isValid });
330332
}
331333

332334
_handleInputLiveChange() {
@@ -425,6 +427,8 @@ class DatePicker extends UI5Element {
425427
this.closePicker();
426428

427429
this.fireEvent("change", { value: this.value, valid: true });
430+
// Angular two way data binding
431+
this.fireEvent("value-changed", { value: this.value, valid: true });
428432
}
429433

430434
/**

packages/main/src/Input.js

+2
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,8 @@ class Input extends UI5Element {
483483

484484
if (isUserInput) { // input
485485
this.fireEvent(this.EVENT_INPUT);
486+
// Angular two way data binding
487+
this.fireEvent("value-changed");
486488
return;
487489
}
488490

packages/main/src/Switch.js

+2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ class Switch extends UI5Element {
182182
if (!this.disabled) {
183183
this.checked = !this.checked;
184184
this.fireEvent("change");
185+
// Angular two way data binding;
186+
this.fireEvent("value-changed");
185187
}
186188
}
187189

0 commit comments

Comments
 (0)