move misc to js/ui
This commit is contained in:
parent
594ac2b012
commit
4a48deeb2c
18 changed files with 4 additions and 4 deletions
40
1-js/99-js-misc/01-proxy/03-observable/solution.md
Normal file
40
1-js/99-js-misc/01-proxy/03-observable/solution.md
Normal file
|
@ -0,0 +1,40 @@
|
|||
The solution consists of two parts:
|
||||
|
||||
1. Whenever `.observe(handler)` is called, we need to remember the handler somewhere, to be able to call it later. We can store it right in the object, using our symbol as the key.
|
||||
2. We need a proxy with `set` trap to call handlers in case of any change.
|
||||
|
||||
```js run
|
||||
let handlers = Symbol('handlers');
|
||||
|
||||
function makeObservable(target) {
|
||||
// 1. Initialize handlers store
|
||||
target[handlers] = [];
|
||||
|
||||
// Store the handler function in array for future calls
|
||||
target.observe = function(handler) {
|
||||
this[handlers].push(handler);
|
||||
};
|
||||
|
||||
// 2. Create a proxy to handle changes
|
||||
return new Proxy(target, {
|
||||
set(target, property, value, receiver) {
|
||||
let success = Reflect.set(...arguments); // forward the operation to object
|
||||
if (success) { // if there were no error while setting the property
|
||||
// call all handlers
|
||||
target[handlers].forEach(handler => handler(property, value));
|
||||
}
|
||||
return success;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let user = {};
|
||||
|
||||
user = makeObservable(user);
|
||||
|
||||
user.observe((key, value) => {
|
||||
alert(`SET ${key}=${value}`);
|
||||
});
|
||||
|
||||
user.name = "John";
|
||||
```
|
Loading…
Add table
Add a link
Reference in a new issue