From c124eaac95739dd9775635a4ddacbd4828febe2e Mon Sep 17 00:00:00 2001 From: Thomas Michon Date: Mon, 30 Mar 2015 19:14:40 -0700 Subject: [PATCH 1/2] Add support for mappingOptions in knockout.projections Added support for new features introduced in knockout-projections, mappingOptions parameters with either a mapping/disposeItem pair or a single mappingWithDisposeCallback function which produces a mappedItem/dispose pair. --- .../knockout.projections-tests.ts | 28 +++++++++++++++++++ .../knockout.projections.d.ts | 14 ++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/knockout.projections/knockout.projections-tests.ts b/knockout.projections/knockout.projections-tests.ts index 3d479e7ac..d8d6c8dcd 100644 --- a/knockout.projections/knockout.projections-tests.ts +++ b/knockout.projections/knockout.projections-tests.ts @@ -26,3 +26,31 @@ sourceItems.push(9); sourceItems.push(10); // evenSquares now contains [36, 16, 4, 100] + +// Testing mapping options + +interface IComplexItem { + value: string; + dispose(): void; +} + +var complexItems = sourceItems.map({ + mapping: x => { + var item: IComplexItem = { + value: (x * x).toString(), + dispose: () => { } + }; + + return item; + }, + disposeItem: (item: IComplexItem) => item.dispose() +}); + +var complexItems2 = sourceItems.map({ + mappingWithDisposeCallback: x => { + return { + mappedValue: (x * x).toString(), + dispose: () => { } + }; + } +}); diff --git a/knockout.projections/knockout.projections.d.ts b/knockout.projections/knockout.projections.d.ts index 77f3bf0ec..a9ff8b5f3 100644 --- a/knockout.projections/knockout.projections.d.ts +++ b/knockout.projections/knockout.projections.d.ts @@ -6,7 +6,17 @@ /// interface KnockoutObservableArrayFunctions { - - map(mapping: (value: T) => TResult): KnockoutObservableArray; + map(mappingOptions: { + mappingWithDisposeCallback: (value: T) => { + mappedValue: TResult; + dispose: () => void; + }; + }): KnockoutObservableArray; + map(mappingOptions: { + mapping: (value: T) => TResult; + disposeItem?: (mappedItem: TResult) => void; + }): KnockoutObservableArray; + map(mappingOptions: (value: T) => TResult): KnockoutObservableArray; + filter(predicate: (value: T) => boolean): KnockoutObservableArray; } From 697223d3e63621b69b2f0db894335f2d0758bf03 Mon Sep 17 00:00:00 2001 From: Thomas Michon Date: Mon, 30 Mar 2015 19:27:44 -0700 Subject: [PATCH 2/2] Make map and filter return type with a dispose method Defined a KnockoutMappedObservableArray type which extends KnockoutSubscription, providing a dispose() method since the mapped arrays require disposal for proper cleanup. --- knockout.projections/knockout.projections-tests.ts | 8 ++++++++ knockout.projections/knockout.projections.d.ts | 11 +++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/knockout.projections/knockout.projections-tests.ts b/knockout.projections/knockout.projections-tests.ts index d8d6c8dcd..138d36946 100644 --- a/knockout.projections/knockout.projections-tests.ts +++ b/knockout.projections/knockout.projections-tests.ts @@ -54,3 +54,11 @@ var complexItems2 = sourceItems.map({ }; } }); + +// Test disposal + +evenSquares.dispose(); + +complexItems.dispose(); + +complexItems2.dispose(); diff --git a/knockout.projections/knockout.projections.d.ts b/knockout.projections/knockout.projections.d.ts index a9ff8b5f3..e1443478a 100644 --- a/knockout.projections/knockout.projections.d.ts +++ b/knockout.projections/knockout.projections.d.ts @@ -5,18 +5,21 @@ /// +interface KnockoutMappedObservableArray extends KnockoutObservableArray, KnockoutSubscription { +} + interface KnockoutObservableArrayFunctions { map(mappingOptions: { mappingWithDisposeCallback: (value: T) => { mappedValue: TResult; dispose: () => void; }; - }): KnockoutObservableArray; + }): KnockoutMappedObservableArray; map(mappingOptions: { mapping: (value: T) => TResult; disposeItem?: (mappedItem: TResult) => void; - }): KnockoutObservableArray; - map(mappingOptions: (value: T) => TResult): KnockoutObservableArray; + }): KnockoutMappedObservableArray; + map(mappingOptions: (value: T) => TResult): KnockoutMappedObservableArray; - filter(predicate: (value: T) => boolean): KnockoutObservableArray; + filter(predicate: (value: T) => boolean): KnockoutMappedObservableArray; }