From 1717b336221f5877fb9b3996121629a278f0087c Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Fri, 11 Dec 2015 13:21:12 +0200 Subject: [PATCH] Fixed Issue ##1235: ObservableArray does not raise its `change` event when its `length' property is set. --- apps/tests/observable-array-tests.ts | 40 +++++++++++++++++++++++ data/observable-array/observable-array.ts | 3 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/apps/tests/observable-array-tests.ts b/apps/tests/observable-array-tests.ts index 40b3b960c..e8306b0da 100644 --- a/apps/tests/observable-array-tests.ts +++ b/apps/tests/observable-array-tests.ts @@ -606,6 +606,46 @@ export var test_ObservableArray_lastIndexOfShouldReturnCorrectIndexStartingFrom TKUnit.assert(result === 1, "ObservableArray lastIndexOf() should return correct index!"); }; +export var test_ObservableArray_settingLengthToZeroPerformsSplice = function () { + var array = new observableArrayModule.ObservableArray([1, 2, 3]); + + var changeRaised = false; + array.on("change", (args: observableArrayModule.ChangedData) => { + changeRaised = true; + TKUnit.assertEqual(args.object, array); + TKUnit.assertEqual(args.eventName, "change"); + TKUnit.assertEqual(args.action, observableArrayModule.ChangeType.Splice); + TKUnit.assertEqual(args.index, 0); + TKUnit.assertEqual(args.addedCount, 0); + TKUnit.arrayAssert(args.removed, [1, 2, 3]); + }); + + array.length = 0; + + TKUnit.assertEqual(array.length, 0); + TKUnit.assertTrue(changeRaised); +}; + +export var test_ObservableArray_settingLengthToSomethingPerformsSplice = function () { + var array = new observableArrayModule.ObservableArray([1, 2, 3]); + + var changeRaised = false; + array.on("change", (args: observableArrayModule.ChangedData) => { + changeRaised = true; + TKUnit.assertEqual(args.object, array); + TKUnit.assertEqual(args.eventName, "change"); + TKUnit.assertEqual(args.action, observableArrayModule.ChangeType.Splice); + TKUnit.assertEqual(args.index, 1); + TKUnit.assertEqual(args.addedCount, 0); + TKUnit.arrayAssert(args.removed, [2, 3]); + }); + + array.length = 1; + + TKUnit.assertEqual(array.length, 1); + TKUnit.assertTrue(changeRaised); +}; + var array = new observableArrayModule.ObservableArray(); // We do not have indexer! diff --git a/data/observable-array/observable-array.ts b/data/observable-array/observable-array.ts index 76025f2ac..cc50bc6fc 100644 --- a/data/observable-array/observable-array.ts +++ b/data/observable-array/observable-array.ts @@ -70,8 +70,7 @@ export class ObservableArray extends observable.Observable implements observa } set length(value: number) { if (types.isNumber(value) && this._array && this._array.length !== value) { - this._array = this._array.slice(0, value); - this._notifyLengthChange(); + this.splice(value, this._array.length - value); } }