From 86722faf435ca9b667c28d0ced4235b06c88e30c Mon Sep 17 00:00:00 2001 From: Jeremy Danyow Date: Sat, 23 Jan 2016 12:58:26 -0500 Subject: [PATCH] fix(choice-observers): notify on setValue fixes #251 --- src/checked-observer.js | 3 ++ src/select-value-observer.js | 2 ++ test/checked-observer.spec.js | 50 ++++++++++++++++++++++++++++++ test/select-value-observer.spec.js | 10 ++++++ 4 files changed, 65 insertions(+) diff --git a/src/checked-observer.js b/src/checked-observer.js index 2e371c48..6b776304 100644 --- a/src/checked-observer.js +++ b/src/checked-observer.js @@ -18,6 +18,7 @@ export class CheckedObserver { if (this.value === newValue) { return; } + // unsubscribe from old array. if (this.arrayObserver) { this.arrayObserver.unsubscribe(checkedArrayContext, this); @@ -29,8 +30,10 @@ export class CheckedObserver { this.arrayObserver.subscribe(checkedArrayContext, this); } // assign and sync element. + this.oldValue = this.value; this.value = newValue; this.synchronizeElement(); + this.notify(); // queue up an initial sync after the bindings have been evaluated. if (!this.initialSync) { this.initialSync = true; diff --git a/src/select-value-observer.js b/src/select-value-observer.js index 518f7b6a..4c3d2bfd 100644 --- a/src/select-value-observer.js +++ b/src/select-value-observer.js @@ -33,8 +33,10 @@ export class SelectValueObserver { this.arrayObserver.subscribe(selectArrayContext, this); } // assign and sync element. + this.oldValue = this.value; this.value = newValue; this.synchronizeOptions(); + this.notify(); // queue up an initial sync after the bindings have been evaluated. if (!this.initialSync) { this.initialSync = true; diff --git a/test/checked-observer.spec.js b/test/checked-observer.spec.js index 735102f5..1a5220f6 100644 --- a/test/checked-observer.spec.js +++ b/test/checked-observer.spec.js @@ -49,6 +49,16 @@ describe('CheckedObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = []; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = binding.targetObserver; spyOn(targetObserver, 'unbind').and.callThrough(); @@ -94,6 +104,16 @@ describe('CheckedObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = []; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = binding.targetObserver; spyOn(targetObserver, 'unbind').and.callThrough(); @@ -140,6 +160,16 @@ describe('CheckedObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = []; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = binding.targetObserver; spyOn(targetObserver, 'unbind').and.callThrough(); @@ -184,6 +214,16 @@ describe('CheckedObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = true; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = binding.targetObserver; spyOn(targetObserver, 'unbind').and.callThrough(); @@ -234,6 +274,16 @@ describe('CheckedObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = []; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = binding.targetObserver; spyOn(targetObserver, 'unbind').and.callThrough(); diff --git a/test/select-value-observer.spec.js b/test/select-value-observer.spec.js index f8e1f421..b8085ba5 100644 --- a/test/select-value-observer.spec.js +++ b/test/select-value-observer.spec.js @@ -98,6 +98,16 @@ describe('SelectValueObserver', () => { }, 0); }); + it('notifies', () => { + let targetObserver = binding.targetObserver; + let spy = jasmine.createSpy('callback'); + let oldValue = binding.targetObserver.getValue(); + let newValue = []; + targetObserver.subscribe(spy); + targetObserver.setValue(newValue); + expect(spy).toHaveBeenCalledWith(newValue, oldValue); + }); + it('unbinds', () => { var targetObserver = observerLocator.getObserver(el, 'value'); spyOn(targetObserver, 'unbind').and.callThrough();