mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] reactivity: slightly improve code and typing
This commit is contained in:
committed by
Samuel Degueldre
parent
ad4673cb36
commit
4efe1ae166
+5
-8
@@ -13,9 +13,9 @@ const OBSERVER = Symbol("observer");
|
|||||||
const KEYS = Symbol("keys");
|
const KEYS = Symbol("keys");
|
||||||
const ROOT = Symbol("root");
|
const ROOT = Symbol("root");
|
||||||
|
|
||||||
export function atom(source: any, observer: Observer) {
|
export function atom<T>(source: T, observer: Observer): T {
|
||||||
if (isTrackable(source) && observerSourceAtom.has(observer)) {
|
if (isTrackable(source) && observerSourceAtom.has(observer)) {
|
||||||
source = source[SOURCE] || source;
|
source = (source as any)[SOURCE] || source;
|
||||||
const oldAtom = observerSourceAtom.get(observer)!.get(source);
|
const oldAtom = observerSourceAtom.get(observer)!.get(source);
|
||||||
if (oldAtom) {
|
if (oldAtom) {
|
||||||
return oldAtom;
|
return oldAtom;
|
||||||
@@ -33,8 +33,7 @@ export function atom(source: any, observer: Observer) {
|
|||||||
|
|
||||||
function createAtom(source: Source, observer: Observer): Atom {
|
function createAtom(source: Source, observer: Observer): Atom {
|
||||||
const keys: Set<any> = new Set();
|
const keys: Set<any> = new Set();
|
||||||
let self: Atom;
|
return new Proxy(source as any, {
|
||||||
const newAtom: Atom = new Proxy(source as any, {
|
|
||||||
set(target: any, key: string, value: any): boolean {
|
set(target: any, key: string, value: any): boolean {
|
||||||
if (!(key in target)) {
|
if (!(key in target)) {
|
||||||
target[key] = value;
|
target[key] = value;
|
||||||
@@ -65,7 +64,7 @@ function createAtom(source: Source, observer: Observer): Atom {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
get(target: any, key: any): any {
|
get(target: any, key: any, proxy: any): any {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case OBSERVER:
|
case OBSERVER:
|
||||||
return observer;
|
return observer;
|
||||||
@@ -81,7 +80,7 @@ function createAtom(source: Source, observer: Observer): Atom {
|
|||||||
if (!atoms.has(key)) {
|
if (!atoms.has(key)) {
|
||||||
atoms.set(key, new ObserverSet());
|
atoms.set(key, new ObserverSet());
|
||||||
}
|
}
|
||||||
atoms.get(key)!.add(self);
|
atoms.get(key)!.add(proxy);
|
||||||
keys.add(key);
|
keys.add(key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@@ -89,8 +88,6 @@ function createAtom(source: Source, observer: Observer): Atom {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
self = newAtom;
|
|
||||||
return newAtom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function isTrackable(value: any): boolean {
|
function isTrackable(value: any): boolean {
|
||||||
|
|||||||
@@ -871,7 +871,7 @@ describe("Reactivity: atom", () => {
|
|||||||
let n = 0;
|
let n = 0;
|
||||||
const observer = () => n++;
|
const observer = () => n++;
|
||||||
const unregisterObserver = registerObserver(observer);
|
const unregisterObserver = registerObserver(observer);
|
||||||
const state = atom({ a: 1 }, observer);
|
const state = atom({ a: 1 } as any, observer);
|
||||||
|
|
||||||
state.a = state.a;
|
state.a = state.a;
|
||||||
await nextMicroTick();
|
await nextMicroTick();
|
||||||
|
|||||||
Reference in New Issue
Block a user