[IMP] observer: add set and delete static functions

This rev. add a 'set' and 'delete' static functions to the Observer.
They allow to set or delete (only for objects) properties on
observed objects or arrays.

With this, the 'set' functions in Store and Component are no longer
necessary, so they have been removed.

Closes #138
This commit is contained in:
Aaron Bohy
2019-06-06 09:08:51 +02:00
committed by Géry Debongnie
parent 49baf0de6e
commit d1094f647a
7 changed files with 106 additions and 58 deletions
-8
View File
@@ -340,14 +340,6 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
}
}
/**
* Sets a key (from the state) to a specific value. This is mostly useful to
* work around the limitation in observed value with new keys.
*/
set(target: any, key: string | number, value: any) {
this.__owl__.observer!.set(target, key, value);
}
/**
* Emit a custom event of type 'eventType' with the given 'payload' on the
* component's el, if it exists. However, note that the event will only bubble
+37 -2
View File
@@ -76,6 +76,24 @@ export class Observer {
allowMutations: boolean = true;
dirty: boolean = false;
static set(target: any, key: number | string, value: any) {
if (!target.__owl__) {
throw Error(
"`Observer.set()` can only be called with observed Objects or Arrays"
);
}
target.__owl__.observer.set(target, key, value);
}
static delete(target: any, key: number | string) {
if (!target.__owl__) {
throw Error(
"`Observer.delete()` can only be called with observed Objects"
);
}
target.__owl__.observer.delete(target, key);
}
notifyCB() {}
notifyChange() {
this.dirty = true;
@@ -120,8 +138,19 @@ export class Observer {
this.notifyChange();
}
delete(target: any, key: number | string) {
delete target[key];
this._updateRevNumber(target);
this.notifyChange();
}
_observeObj<T extends { __owl__?: any }>(obj: T, parent?: any) {
obj.__owl__ = { rev: this.rev, deepRev: this.rev, parent };
obj.__owl__ = {
rev: this.rev,
deepRev: this.rev,
parent,
observer: this
};
Object.defineProperty(obj, "__owl__", { enumerable: false });
for (let key in obj) {
this._addProp(obj, key, obj[key]);
@@ -129,7 +158,12 @@ export class Observer {
}
_observeArr(arr: Array<any>, parent?: any) {
(<any>arr).__owl__ = { rev: this.rev, deepRev: this.rev, parent };
(<any>arr).__owl__ = {
rev: this.rev,
deepRev: this.rev,
parent,
observer: this
};
Object.defineProperty(arr, "__owl__", { enumerable: false });
(<any>arr).__proto__ = Object.create(ModifiedArrayProto);
(<any>arr).__proto__.__observer__ = this;
@@ -145,6 +179,7 @@ export class Observer {
) {
var self = this;
Object.defineProperty(obj, key, {
configurable: true,
enumerable: true,
get() {
return value;
+1 -4
View File
@@ -21,7 +21,7 @@ import { Observer } from "./observer";
// Store Definition
//------------------------------------------------------------------------------
type Mutation = ({ state, commit, set, getters }, payload: any) => void;
type Mutation = ({ state, commit, getters }, payload: any) => void;
type Action = ({ commit, state, dispatch, env, getters }, payload: any) => void;
type Getter = ({ state, getters }, payload) => any;
@@ -46,7 +46,6 @@ export class Store extends EventBus {
debug: boolean;
env: any;
observer: Observer;
set: any;
getters: { [name: string]: (payload?) => any };
constructor(config: StoreConfig, options: StoreOption = {}) {
@@ -65,7 +64,6 @@ export class Store extends EventBus {
if (this.debug) {
this.history.push({ state: this.state });
}
this.set = this.observer.set.bind(this.observer);
for (let entry of Object.entries(config.getters || {})) {
const name: string = entry[0];
@@ -110,7 +108,6 @@ export class Store extends EventBus {
{
commit: this.commit.bind(this),
state: this.state,
set: this.set,
getters: this.getters
},
payload