diff --git a/src/session_nub.ts b/src/session_nub.ts index d1f320d1505063d53fcfcd41ea0d9d2c8aaa32cf..fb9a96d36282d79890ee6bb5170fb025673948f2 100644 --- a/src/session_nub.ts +++ b/src/session_nub.ts @@ -30,12 +30,28 @@ export class Props implements IObservable { return this._props[key]; } + /** + * notification de changement de la valeur d'une propriété + * @param prop nom de la propriété modifiée + * @param val nouvelle valeur + * @param sender objet ayant changé la valeur + */ private notifyPropChange(prop: string, val: any, sender: any) { this.notifyObservers({ "action": "propertyChange", "name": prop, "value": val - }, sender) + }, sender); + } + + /** + * notification de changement de la valeur de toutes les propriétés + * @param sender objet ayant changé les valeurs + */ + private notifyPropsChange(sender: any) { + this.notifyObservers({ + "action": "propertiesChange", + }, sender); } public setPropValue(key: string, val: any, sender?: any): boolean { @@ -48,6 +64,49 @@ export class Props implements IObservable { return changed; } + /** + * compare 2 objets (clés et valeurs) + * @return true s'il existe une différence + */ + private compareObjects(o1: { [key: string]: any }, o2: { [key: string]: any }) { + const oldKeys: string[] = Object.keys(o1).sort(); + const newKeys: string[] = Object.keys(o2).sort(); + + // nombre de clés + let changed = oldKeys.length !== newKeys.length; + if (changed) + return true; + + // nom des clés + for (const i in oldKeys) + if (oldKeys[i] !== newKeys[i]) + return true; + + // valeurs + for (const i in o1) + if (o1[i] != o2[i]) + return true; + + return false; + } + + /** + * fixe la valeur de toutes les propriétés + * @param props nouvelles valeurs + * @param sender objet modificateur + */ + public setProps(props: {}, sender?: any) { + if (props instanceof Props) + var p = props.props; + else + p = props; + const changed = this.compareObjects(this._props, p); + if (changed) { + this._props = p; + this.notifyPropsChange(sender); + } + } + public get props() { return this._props; }