diff --git a/knockout.projections/knockout.projections-tests.ts b/knockout.projections/knockout.projections-tests.ts index 3d479e7ac..138d36946 100644 --- a/knockout.projections/knockout.projections-tests.ts +++ b/knockout.projections/knockout.projections-tests.ts @@ -26,3 +26,39 @@ 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: () => { } + }; + } +}); + +// 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 77f3bf0ec..e1443478a 100644 --- a/knockout.projections/knockout.projections.d.ts +++ b/knockout.projections/knockout.projections.d.ts @@ -5,8 +5,21 @@ /// +interface KnockoutMappedObservableArray extends KnockoutObservableArray, KnockoutSubscription { +} + interface KnockoutObservableArrayFunctions { - - map(mapping: (value: T) => TResult): KnockoutObservableArray; - filter(predicate: (value: T) => boolean): KnockoutObservableArray; + map(mappingOptions: { + mappingWithDisposeCallback: (value: T) => { + mappedValue: TResult; + dispose: () => void; + }; + }): KnockoutMappedObservableArray; + map(mappingOptions: { + mapping: (value: T) => TResult; + disposeItem?: (mappedItem: TResult) => void; + }): KnockoutMappedObservableArray; + map(mappingOptions: (value: T) => TResult): KnockoutMappedObservableArray; + + filter(predicate: (value: T) => boolean): KnockoutMappedObservableArray; }