diff --git a/ivette/src/dome/renderer/layout/forms.tsx b/ivette/src/dome/renderer/layout/forms.tsx index bf30fccd8aa229908c3b7def7242991bebf5a2f7..ffb497983ea5e19551ed5efce66742d73100307b 100644 --- a/ivette/src/dome/renderer/layout/forms.tsx +++ b/ivette/src/dome/renderer/layout/forms.tsx @@ -155,6 +155,7 @@ export type BufferCallback = () => void; export class BufferController { private readonly evt = new Events(); private errors = 0; + private notified = false; /** Notify all reset listener events. */ reset(): void { this.evt.emit('reset'); } @@ -168,6 +169,9 @@ export class BufferController { /** There are active listeners for Commit event. */ hasCommit(): boolean { return this.evt.listenerCount('commit') > 0; } + /** Reset notified to false. */ + resetNotified(): void { this.notified = false; } + /** Get the number of errors */ getErrors(): number { return this.errors; } @@ -178,7 +182,12 @@ export class BufferController { } /** @internal */ - protected notify(): void { this.evt.emit('update'); } + protected notify(): void { + if(!this.notified) { + this.evt.emit('update'); + this.notified = true; + } + } /** @internal */ onChange(fn: BufferCallback): void { this.evt.addListener('update', fn); } @@ -332,11 +341,13 @@ export function useBuffer<A>( setModified(!isReset); setBuffer(newValue); setBerror(newError); - if (isReset && !compare(equal, newValue, value)) { + if (compare(equal, rollback, newValue)) { + setModified(false); + } else if (isReset && !compare(equal, newValue, value)) { setCommited(false); onChanged(newValue, newError, isReset); } - }, [equal, value, onChanged]); + }, [equal, value, rollback, onChanged]); return { value: modified || !commited ? buffer : value,