UNPKG

aurelia-bootstrap

Version:
244 lines (194 loc) 8.72 kB
/* */ define(['exports', './repeat-utilities', 'aurelia-binding'], function (exports, _repeatUtilities, _aureliaBinding) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.ArrayRepeatStrategy = undefined; var ArrayRepeatStrategy = exports.ArrayRepeatStrategy = function () { function ArrayRepeatStrategy() { } ArrayRepeatStrategy.prototype.getCollectionObserver = function getCollectionObserver(observerLocator, items) { return observerLocator.getArrayObserver(items); }; ArrayRepeatStrategy.prototype.instanceChanged = function instanceChanged(repeat, items) { var _this = this; var itemsLength = items.length; if (!items || itemsLength === 0) { repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); return; } var children = repeat.views(); var viewsLength = children.length; if (viewsLength === 0) { this._standardProcessInstanceChanged(repeat, items); return; } if (repeat.viewsRequireLifecycle) { (function () { var childrenSnapshot = children.slice(0); var itemNameInBindingContext = repeat.local; var matcher = repeat.matcher(); var itemsPreviouslyInViews = []; var viewsToRemove = []; for (var index = 0; index < viewsLength; index++) { var view = childrenSnapshot[index]; var oldItem = view.bindingContext[itemNameInBindingContext]; if ((0, _repeatUtilities.indexOf)(items, oldItem, matcher) === -1) { viewsToRemove.push(view); } else { itemsPreviouslyInViews.push(oldItem); } } var updateViews = void 0; var removePromise = void 0; if (itemsPreviouslyInViews.length > 0) { removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); updateViews = function updateViews() { for (var _index = 0; _index < itemsLength; _index++) { var item = items[_index]; var indexOfView = (0, _repeatUtilities.indexOf)(itemsPreviouslyInViews, item, matcher, _index); var _view = void 0; if (indexOfView === -1) { var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[_index], _index, itemsLength); repeat.insertView(_index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews.splice(_index, 0, undefined); } else if (indexOfView === _index) { _view = children[indexOfView]; itemsPreviouslyInViews[indexOfView] = undefined; } else { _view = children[indexOfView]; repeat.moveView(indexOfView, _index); itemsPreviouslyInViews.splice(indexOfView, 1); itemsPreviouslyInViews.splice(_index, 0, undefined); } if (_view) { (0, _repeatUtilities.updateOverrideContext)(_view.overrideContext, _index, itemsLength); } } _this._inPlaceProcessItems(repeat, items); }; } else { removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); updateViews = function updateViews() { return _this._standardProcessInstanceChanged(repeat, items); }; } if (removePromise instanceof Promise) { removePromise.then(updateViews); } else { updateViews(); } })(); } else { this._inPlaceProcessItems(repeat, items); } }; ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function _standardProcessInstanceChanged(repeat, items) { for (var i = 0, ii = items.length; i < ii; i++) { var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[i], i, ii); repeat.addView(overrideContext.bindingContext, overrideContext); } }; ArrayRepeatStrategy.prototype._inPlaceProcessItems = function _inPlaceProcessItems(repeat, items) { var itemsLength = items.length; var viewsLength = repeat.viewCount(); while (viewsLength > itemsLength) { viewsLength--; repeat.removeView(viewsLength, true, !repeat.viewsRequireLifecycle); } var local = repeat.local; for (var i = 0; i < viewsLength; i++) { var view = repeat.view(i); var last = i === itemsLength - 1; var middle = i !== 0 && !last; if (view.bindingContext[local] === items[i] && view.overrideContext.$middle === middle && view.overrideContext.$last === last) { continue; } view.bindingContext[local] = items[i]; view.overrideContext.$middle = middle; view.overrideContext.$last = last; repeat.updateBindings(view); } for (var _i = viewsLength; _i < itemsLength; _i++) { var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, items[_i], _i, itemsLength); repeat.addView(overrideContext.bindingContext, overrideContext); } }; ArrayRepeatStrategy.prototype.instanceMutated = function instanceMutated(repeat, array, splices) { var _this2 = this; if (repeat.__queuedSplices) { for (var i = 0, ii = splices.length; i < ii; ++i) { var _splices$i = splices[i], index = _splices$i.index, removed = _splices$i.removed, addedCount = _splices$i.addedCount; (0, _aureliaBinding.mergeSplice)(repeat.__queuedSplices, index, removed, addedCount); } repeat.__array = array.slice(0); return; } var maybePromise = this._runSplices(repeat, array.slice(0), splices); if (maybePromise instanceof Promise) { (function () { var queuedSplices = repeat.__queuedSplices = []; var runQueuedSplices = function runQueuedSplices() { if (!queuedSplices.length) { repeat.__queuedSplices = undefined; repeat.__array = undefined; return; } var nextPromise = _this2._runSplices(repeat, repeat.__array, queuedSplices) || Promise.resolve(); queuedSplices = repeat.__queuedSplices = []; nextPromise.then(runQueuedSplices); }; maybePromise.then(runQueuedSplices); })(); } }; ArrayRepeatStrategy.prototype._runSplices = function _runSplices(repeat, array, splices) { var _this3 = this; var removeDelta = 0; var rmPromises = []; for (var i = 0, ii = splices.length; i < ii; ++i) { var splice = splices[i]; var removed = splice.removed; for (var j = 0, jj = removed.length; j < jj; ++j) { var viewOrPromise = repeat.removeView(splice.index + removeDelta + rmPromises.length, true); if (viewOrPromise instanceof Promise) { rmPromises.push(viewOrPromise); } } removeDelta -= splice.addedCount; } if (rmPromises.length > 0) { return Promise.all(rmPromises).then(function () { var spliceIndexLow = _this3._handleAddedSplices(repeat, array, splices); (0, _repeatUtilities.updateOverrideContexts)(repeat.views(), spliceIndexLow); }); } var spliceIndexLow = this._handleAddedSplices(repeat, array, splices); (0, _repeatUtilities.updateOverrideContexts)(repeat.views(), spliceIndexLow); return undefined; }; ArrayRepeatStrategy.prototype._handleAddedSplices = function _handleAddedSplices(repeat, array, splices) { var spliceIndex = void 0; var spliceIndexLow = void 0; var arrayLength = array.length; for (var i = 0, ii = splices.length; i < ii; ++i) { var splice = splices[i]; var addIndex = spliceIndex = splice.index; var end = splice.index + splice.addedCount; if (typeof spliceIndexLow === 'undefined' || spliceIndexLow === null || spliceIndexLow > splice.index) { spliceIndexLow = spliceIndex; } for (; addIndex < end; ++addIndex) { var overrideContext = (0, _repeatUtilities.createFullOverrideContext)(repeat, array[addIndex], addIndex, arrayLength); repeat.insertView(addIndex, overrideContext.bindingContext, overrideContext); } } return spliceIndexLow; }; return ArrayRepeatStrategy; }(); });