aurelia-templating-resources
Version:
A standard set of behaviors, converters and other resources for use with the Aurelia templating library.
60 lines (50 loc) • 1.6 kB
text/typescript
import {createFullOverrideContext, updateOverrideContexts} from './repeat-utilities';
/**
* A strategy for repeating a template over a number.
*/
export class NumberRepeatStrategy {
/**
* Return the strategies collection observer. In this case none.
*/
getCollectionObserver() {
return null;
}
/**
* Process the provided Number.
* @param value The Number of how many time to iterate.
*/
instanceChanged(repeat, value) {
let removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle);
if (removePromise instanceof Promise) {
removePromise.then(() => this._standardProcessItems(repeat, value));
return;
}
this._standardProcessItems(repeat, value);
}
/**
* @internal
*/
_standardProcessItems(repeat, value) {
let childrenLength = repeat.viewCount();
let i;
let ii;
let overrideContext;
let viewsToRemove;
value = Math.floor(value);
viewsToRemove = childrenLength - value;
if (viewsToRemove > 0) {
if (viewsToRemove > childrenLength) {
viewsToRemove = childrenLength;
}
for (i = 0, ii = viewsToRemove; i < ii; ++i) {
repeat.removeView(childrenLength - (i + 1), true, !repeat.viewsRequireLifecycle);
}
return;
}
for (i = childrenLength, ii = value; i < ii; ++i) {
overrideContext = createFullOverrideContext(repeat, i, i, ii);
repeat.addView(overrideContext.bindingContext, overrideContext);
}
updateOverrideContexts(repeat.views(), 0);
}
}