diff --git a/bower.json b/bower.json index ad42f44..b8ad68f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "aurelia-templating-resources", - "version": "1.11.0", + "version": "1.12.0", "description": "A standard set of behaviors, converters and other resources for use with the Aurelia templating library.", "keywords": [ "aurelia", diff --git a/dist/amd/aurelia-templating-resources.js b/dist/amd/aurelia-templating-resources.js index 9fc6ad6..24936df 100644 --- a/dist/amd/aurelia-templating-resources.js +++ b/dist/amd/aurelia-templating-resources.js @@ -36,8 +36,14 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- return c > 3 && r && Object.defineProperty(target, key, r), r; } + var ActivationStrategy; + (function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; + })(ActivationStrategy || (ActivationStrategy = {})); var Compose = (function () { function Compose(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -94,6 +100,9 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- __decorate([ aureliaTemplating.bindable ], Compose.prototype, "viewModel", void 0); + __decorate([ + aureliaTemplating.bindable + ], Compose.prototype, "activationStrategy", void 0); __decorate([ aureliaTemplating.bindable ], Compose.prototype, "swapOrder", void 0); @@ -130,13 +139,7 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- function processChanges(composer) { var changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { var instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -149,6 +152,12 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(function () { completeCompositionTask(composer); @@ -172,6 +181,16 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- composer.updateRequested = false; processChanges(composer); }); + } + function needsReInitialization(composer, changes) { + var activationStrategy = composer.activationStrategy; + var vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } var IfCore = (function () { @@ -477,21 +496,22 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- }; ArrayRepeatStrategy.prototype.instanceChanged = function (repeat, items) { var _this = this; + var $repeat = repeat; var itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - var children = repeat.views(); + var children = $repeat.views(); var viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { var childrenSnapshot = children.slice(0); - var itemNameInBindingContext = repeat.local; - var matcher_1 = repeat.matcher(); + var itemNameInBindingContext = $repeat.local; + var matcher_1 = $repeat.matcher(); var itemsPreviouslyInViews_1 = []; var viewsToRemove = []; for (var index = 0; index < viewsLength; index++) { @@ -507,15 +527,15 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- var updateViews = void 0; var removePromise = void 0; if (itemsPreviouslyInViews_1.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = function () { for (var index = 0; index < itemsLength; index++) { var item = items[index]; var indexOfView = indexOf(itemsPreviouslyInViews_1, item, matcher_1, index); var view = void 0; if (indexOfView === -1) { - var overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + var overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews_1.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -524,7 +544,7 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews_1.splice(indexOfView, 1); itemsPreviouslyInViews_1.splice(index, 0, undefined); } @@ -532,12 +552,12 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- updateOverrideContext(view.overrideContext, index, itemsLength); } } - _this._inPlaceProcessItems(repeat, items); + _this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = function () { return _this._standardProcessInstanceChanged(repeat, items); }; + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = function () { return _this._standardProcessInstanceChanged($repeat, items); }; } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -547,7 +567,7 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } }; ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function (repeat, items) { @@ -1015,6 +1035,7 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- _this.viewsRequireLifecycle = viewsRequireLifecycle(viewFactory); return _this; } + Repeat_1 = Repeat; Repeat.prototype.call = function (context, changes) { this[context](this.items, changes); }; @@ -1114,28 +1135,34 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- } }; Repeat.prototype._captureAndRemoveMatcherBinding = function () { - if (this.viewFactory.viewFactory) { - var instructions = this.viewFactory.viewFactory.instructions; - var instructionIds = Object.keys(instructions); - for (var i = 0; i < instructionIds.length; i++) { - var expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (var ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - var matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + var viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + var template = viewFactory.template; + var instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; } + var repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; + } + var repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; }; Repeat.prototype.viewCount = function () { return this.viewSlot.children.length; }; Repeat.prototype.views = function () { return this.viewSlot.children; }; Repeat.prototype.view = function (index) { return this.viewSlot.children[index]; }; - Repeat.prototype.matcher = function () { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; }; + Repeat.prototype.matcher = function () { + var matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + }; Repeat.prototype.addView = function (bindingContext, overrideContext) { var view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1173,6 +1200,8 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- } } }; + var Repeat_1; + Repeat.useInnerMatcher = true; __decorate([ aureliaTemplating.bindable ], Repeat.prototype, "items", void 0); @@ -1185,13 +1214,32 @@ define(['exports', 'aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task- __decorate([ aureliaTemplating.bindable ], Repeat.prototype, "value", void 0); - Repeat = __decorate([ + Repeat = Repeat_1 = __decorate([ aureliaTemplating.customAttribute('repeat'), aureliaTemplating.templateController, aureliaDependencyInjection.inject(aureliaTemplating.BoundViewFactory, aureliaTemplating.TargetInstruction, aureliaTemplating.ViewSlot, aureliaTemplating.ViewResources, aureliaBinding.ObserverLocator, RepeatStrategyLocator) ], Repeat); return Repeat; - }(AbstractRepeater)); + }(AbstractRepeater)); + var extractMatcherBindingExpression = function (instructions, targetedElementId) { + var instructionIds = Object.keys(instructions); + for (var i = 0; i < instructionIds.length; i++) { + var instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + var expressions = instructions[instructionId].expressions; + if (expressions) { + for (var ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + var matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } + }; var aureliaHideClassName = 'aurelia-hide'; var aureliaHideClass = "." + aureliaHideClassName + " { display:none !important; }"; diff --git a/dist/amd/aurelia-templating-resources.js.map b/dist/amd/aurelia-templating-resources.js.map index 03a31ab..10e26a9 100644 --- a/dist/amd/aurelia-templating-resources.js.map +++ b/dist/amd/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/aurelia-templating-resources.d.ts b/dist/aurelia-templating-resources.d.ts index 8c039eb..c4ee9da 100644 --- a/dist/aurelia-templating-resources.d.ts +++ b/dist/aurelia-templating-resources.d.ts @@ -1,6 +1,16 @@ import { OverrideContext, bindingMode } from 'aurelia-binding'; import { View, ViewFactory, ViewSlot } from 'aurelia-templating'; +declare enum ActivationStrategy { + /** + * Default activation strategy; the 'activate' lifecycle hook will be invoked when the model changes. + */ + InvokeLifecycle = "invoke-lifecycle", + /** + * The view/view-model will be recreated, when the "model" changes. + */ + Replace = "replace" +} /** * Used to compose a new view / view-model template or bind to an existing instance. */ @@ -26,6 +36,14 @@ export declare class Compose { * @type {Class} */ viewModel: any; + /** + * Strategy to activate the view-model. Default is "invoke-lifecycle". + * Bind "replace" to recreate the view/view-model when the model changes. + * + * @property activationStrategy + * @type {ActivationStrategy} + */ + activationStrategy: ActivationStrategy; /** * SwapOrder to control the swapping order of the custom element's view. * @@ -227,6 +245,14 @@ export declare class AbstractRepeater { * Binding to iterate over iterable objects (Array, Map and Number) to genereate a template for each iteration. */ export declare class Repeat extends AbstractRepeater { + /** + * Setting this to `true` to enable legacy behavior, where a repeat would take first `matcher` binding + * any where inside its view if there's no `matcher` binding on the repeated element itself. + * + * Default value is true to avoid breaking change + * @default true + */ + static useInnerMatcher: boolean; /** * List of items to bind the repeater to. * diff --git a/dist/commonjs/aurelia-templating-resources.js b/dist/commonjs/aurelia-templating-resources.js index ae21a8e..7f79ce4 100644 --- a/dist/commonjs/aurelia-templating-resources.js +++ b/dist/commonjs/aurelia-templating-resources.js @@ -48,8 +48,14 @@ function __decorate(decorators, target, key, desc) { return c > 3 && r && Object.defineProperty(target, key, r), r; } +var ActivationStrategy; +(function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; +})(ActivationStrategy || (ActivationStrategy = {})); var Compose = (function () { function Compose(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -106,6 +112,9 @@ var Compose = (function () { __decorate([ aureliaTemplating.bindable ], Compose.prototype, "viewModel", void 0); + __decorate([ + aureliaTemplating.bindable + ], Compose.prototype, "activationStrategy", void 0); __decorate([ aureliaTemplating.bindable ], Compose.prototype, "swapOrder", void 0); @@ -142,13 +151,7 @@ function createInstruction(composer, instruction) { function processChanges(composer) { var changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { var instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -161,6 +164,12 @@ function processChanges(composer) { composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(function () { completeCompositionTask(composer); @@ -184,6 +193,16 @@ function requestUpdate(composer) { composer.updateRequested = false; processChanges(composer); }); +} +function needsReInitialization(composer, changes) { + var activationStrategy = composer.activationStrategy; + var vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } var IfCore = (function () { @@ -489,21 +508,22 @@ var ArrayRepeatStrategy = (function () { }; ArrayRepeatStrategy.prototype.instanceChanged = function (repeat, items) { var _this = this; + var $repeat = repeat; var itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - var children = repeat.views(); + var children = $repeat.views(); var viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { var childrenSnapshot = children.slice(0); - var itemNameInBindingContext = repeat.local; - var matcher_1 = repeat.matcher(); + var itemNameInBindingContext = $repeat.local; + var matcher_1 = $repeat.matcher(); var itemsPreviouslyInViews_1 = []; var viewsToRemove = []; for (var index = 0; index < viewsLength; index++) { @@ -519,15 +539,15 @@ var ArrayRepeatStrategy = (function () { var updateViews = void 0; var removePromise = void 0; if (itemsPreviouslyInViews_1.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = function () { for (var index = 0; index < itemsLength; index++) { var item = items[index]; var indexOfView = indexOf(itemsPreviouslyInViews_1, item, matcher_1, index); var view = void 0; if (indexOfView === -1) { - var overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + var overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews_1.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -536,7 +556,7 @@ var ArrayRepeatStrategy = (function () { } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews_1.splice(indexOfView, 1); itemsPreviouslyInViews_1.splice(index, 0, undefined); } @@ -544,12 +564,12 @@ var ArrayRepeatStrategy = (function () { updateOverrideContext(view.overrideContext, index, itemsLength); } } - _this._inPlaceProcessItems(repeat, items); + _this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = function () { return _this._standardProcessInstanceChanged(repeat, items); }; + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = function () { return _this._standardProcessInstanceChanged($repeat, items); }; } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -559,7 +579,7 @@ var ArrayRepeatStrategy = (function () { } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } }; ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function (repeat, items) { @@ -1027,6 +1047,7 @@ var Repeat = (function (_super) { _this.viewsRequireLifecycle = viewsRequireLifecycle(viewFactory); return _this; } + Repeat_1 = Repeat; Repeat.prototype.call = function (context, changes) { this[context](this.items, changes); }; @@ -1126,28 +1147,34 @@ var Repeat = (function (_super) { } }; Repeat.prototype._captureAndRemoveMatcherBinding = function () { - if (this.viewFactory.viewFactory) { - var instructions = this.viewFactory.viewFactory.instructions; - var instructionIds = Object.keys(instructions); - for (var i = 0; i < instructionIds.length; i++) { - var expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (var ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - var matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + var viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + var template = viewFactory.template; + var instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; } + var repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; + } + var repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; }; Repeat.prototype.viewCount = function () { return this.viewSlot.children.length; }; Repeat.prototype.views = function () { return this.viewSlot.children; }; Repeat.prototype.view = function (index) { return this.viewSlot.children[index]; }; - Repeat.prototype.matcher = function () { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; }; + Repeat.prototype.matcher = function () { + var matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + }; Repeat.prototype.addView = function (bindingContext, overrideContext) { var view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1185,6 +1212,8 @@ var Repeat = (function (_super) { } } }; + var Repeat_1; + Repeat.useInnerMatcher = true; __decorate([ aureliaTemplating.bindable ], Repeat.prototype, "items", void 0); @@ -1197,13 +1226,32 @@ var Repeat = (function (_super) { __decorate([ aureliaTemplating.bindable ], Repeat.prototype, "value", void 0); - Repeat = __decorate([ + Repeat = Repeat_1 = __decorate([ aureliaTemplating.customAttribute('repeat'), aureliaTemplating.templateController, aureliaDependencyInjection.inject(aureliaTemplating.BoundViewFactory, aureliaTemplating.TargetInstruction, aureliaTemplating.ViewSlot, aureliaTemplating.ViewResources, aureliaBinding.ObserverLocator, RepeatStrategyLocator) ], Repeat); return Repeat; -}(AbstractRepeater)); +}(AbstractRepeater)); +var extractMatcherBindingExpression = function (instructions, targetedElementId) { + var instructionIds = Object.keys(instructions); + for (var i = 0; i < instructionIds.length; i++) { + var instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + var expressions = instructions[instructionId].expressions; + if (expressions) { + for (var ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + var matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } +}; var aureliaHideClassName = 'aurelia-hide'; var aureliaHideClass = "." + aureliaHideClassName + " { display:none !important; }"; diff --git a/dist/commonjs/aurelia-templating-resources.js.map b/dist/commonjs/aurelia-templating-resources.js.map index b068050..11f4f44 100644 --- a/dist/commonjs/aurelia-templating-resources.js.map +++ b/dist/commonjs/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/es2015/aurelia-templating-resources.js b/dist/es2015/aurelia-templating-resources.js index a37e684..28997af 100644 --- a/dist/es2015/aurelia-templating-resources.js +++ b/dist/es2015/aurelia-templating-resources.js @@ -30,8 +30,14 @@ function __decorate(decorators, target, key, desc) { return c > 3 && r && Object.defineProperty(target, key, r), r; } +var ActivationStrategy; +(function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; +})(ActivationStrategy || (ActivationStrategy = {})); let Compose = class Compose { constructor(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -89,6 +95,9 @@ __decorate([ __decorate([ bindable ], Compose.prototype, "viewModel", void 0); +__decorate([ + bindable +], Compose.prototype, "activationStrategy", void 0); __decorate([ bindable ], Compose.prototype, "swapOrder", void 0); @@ -123,13 +132,7 @@ function createInstruction(composer, instruction) { function processChanges(composer) { const changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { let instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -142,6 +145,12 @@ function processChanges(composer) { composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(() => { completeCompositionTask(composer); @@ -165,6 +174,16 @@ function requestUpdate(composer) { composer.updateRequested = false; processChanges(composer); }); +} +function needsReInitialization(composer, changes) { + let activationStrategy = composer.activationStrategy; + const vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } class IfCore { @@ -457,21 +476,22 @@ class ArrayRepeatStrategy { return observerLocator.getArrayObserver(items); } instanceChanged(repeat, items) { + const $repeat = repeat; const itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - const children = repeat.views(); + const children = $repeat.views(); const viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { const childrenSnapshot = children.slice(0); - const itemNameInBindingContext = repeat.local; - const matcher = repeat.matcher(); + const itemNameInBindingContext = $repeat.local; + const matcher = $repeat.matcher(); let itemsPreviouslyInViews = []; const viewsToRemove = []; for (let index = 0; index < viewsLength; index++) { @@ -487,15 +507,15 @@ class ArrayRepeatStrategy { let updateViews; let removePromise; if (itemsPreviouslyInViews.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = () => { for (let index = 0; index < itemsLength; index++) { const item = items[index]; const indexOfView = indexOf(itemsPreviouslyInViews, item, matcher, index); let view; if (indexOfView === -1) { - const overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + const overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -504,7 +524,7 @@ class ArrayRepeatStrategy { } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews.splice(indexOfView, 1); itemsPreviouslyInViews.splice(index, 0, undefined); } @@ -512,12 +532,12 @@ class ArrayRepeatStrategy { updateOverrideContext(view.overrideContext, index, itemsLength); } } - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = () => this._standardProcessInstanceChanged(repeat, items); + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = () => this._standardProcessInstanceChanged($repeat, items); } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -527,7 +547,7 @@ class ArrayRepeatStrategy { } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } } _standardProcessInstanceChanged(repeat, items) { @@ -954,7 +974,8 @@ class AbstractRepeater { } } -let Repeat = class Repeat extends AbstractRepeater { +var Repeat_1; +let Repeat = Repeat_1 = class Repeat extends AbstractRepeater { constructor(viewFactory, instruction, viewSlot, viewResources, observerLocator, strategyLocator) { super({ local: 'item', @@ -1070,28 +1091,34 @@ let Repeat = class Repeat extends AbstractRepeater { } } _captureAndRemoveMatcherBinding() { - if (this.viewFactory.viewFactory) { - const instructions = this.viewFactory.viewFactory.instructions; - const instructionIds = Object.keys(instructions); - for (let i = 0; i < instructionIds.length; i++) { - const expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (let ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - const matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + const viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + const template = viewFactory.template; + const instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; + } + const repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; } + const repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; } viewCount() { return this.viewSlot.children.length; } views() { return this.viewSlot.children; } view(index) { return this.viewSlot.children[index]; } - matcher() { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; } + matcher() { + const matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + } addView(bindingContext, overrideContext) { let view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1130,6 +1157,7 @@ let Repeat = class Repeat extends AbstractRepeater { } } }; +Repeat.useInnerMatcher = true; __decorate([ bindable ], Repeat.prototype, "items", void 0); @@ -1142,11 +1170,30 @@ __decorate([ __decorate([ bindable ], Repeat.prototype, "value", void 0); -Repeat = __decorate([ +Repeat = Repeat_1 = __decorate([ customAttribute('repeat'), templateController, inject(BoundViewFactory, TargetInstruction, ViewSlot, ViewResources, ObserverLocator, RepeatStrategyLocator) -], Repeat); +], Repeat); +const extractMatcherBindingExpression = (instructions, targetedElementId) => { + const instructionIds = Object.keys(instructions); + for (let i = 0; i < instructionIds.length; i++) { + const instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + const expressions = instructions[instructionId].expressions; + if (expressions) { + for (let ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + const matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } +}; const aureliaHideClassName = 'aurelia-hide'; const aureliaHideClass = `.${aureliaHideClassName} { display:none !important; }`; diff --git a/dist/es2015/aurelia-templating-resources.js.map b/dist/es2015/aurelia-templating-resources.js.map index b7b5f2f..e51ec18 100644 --- a/dist/es2015/aurelia-templating-resources.js.map +++ b/dist/es2015/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/es2017/aurelia-templating-resources.js b/dist/es2017/aurelia-templating-resources.js index a37e684..28997af 100644 --- a/dist/es2017/aurelia-templating-resources.js +++ b/dist/es2017/aurelia-templating-resources.js @@ -30,8 +30,14 @@ function __decorate(decorators, target, key, desc) { return c > 3 && r && Object.defineProperty(target, key, r), r; } +var ActivationStrategy; +(function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; +})(ActivationStrategy || (ActivationStrategy = {})); let Compose = class Compose { constructor(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -89,6 +95,9 @@ __decorate([ __decorate([ bindable ], Compose.prototype, "viewModel", void 0); +__decorate([ + bindable +], Compose.prototype, "activationStrategy", void 0); __decorate([ bindable ], Compose.prototype, "swapOrder", void 0); @@ -123,13 +132,7 @@ function createInstruction(composer, instruction) { function processChanges(composer) { const changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { let instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -142,6 +145,12 @@ function processChanges(composer) { composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(() => { completeCompositionTask(composer); @@ -165,6 +174,16 @@ function requestUpdate(composer) { composer.updateRequested = false; processChanges(composer); }); +} +function needsReInitialization(composer, changes) { + let activationStrategy = composer.activationStrategy; + const vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } class IfCore { @@ -457,21 +476,22 @@ class ArrayRepeatStrategy { return observerLocator.getArrayObserver(items); } instanceChanged(repeat, items) { + const $repeat = repeat; const itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - const children = repeat.views(); + const children = $repeat.views(); const viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { const childrenSnapshot = children.slice(0); - const itemNameInBindingContext = repeat.local; - const matcher = repeat.matcher(); + const itemNameInBindingContext = $repeat.local; + const matcher = $repeat.matcher(); let itemsPreviouslyInViews = []; const viewsToRemove = []; for (let index = 0; index < viewsLength; index++) { @@ -487,15 +507,15 @@ class ArrayRepeatStrategy { let updateViews; let removePromise; if (itemsPreviouslyInViews.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = () => { for (let index = 0; index < itemsLength; index++) { const item = items[index]; const indexOfView = indexOf(itemsPreviouslyInViews, item, matcher, index); let view; if (indexOfView === -1) { - const overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + const overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -504,7 +524,7 @@ class ArrayRepeatStrategy { } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews.splice(indexOfView, 1); itemsPreviouslyInViews.splice(index, 0, undefined); } @@ -512,12 +532,12 @@ class ArrayRepeatStrategy { updateOverrideContext(view.overrideContext, index, itemsLength); } } - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = () => this._standardProcessInstanceChanged(repeat, items); + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = () => this._standardProcessInstanceChanged($repeat, items); } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -527,7 +547,7 @@ class ArrayRepeatStrategy { } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } } _standardProcessInstanceChanged(repeat, items) { @@ -954,7 +974,8 @@ class AbstractRepeater { } } -let Repeat = class Repeat extends AbstractRepeater { +var Repeat_1; +let Repeat = Repeat_1 = class Repeat extends AbstractRepeater { constructor(viewFactory, instruction, viewSlot, viewResources, observerLocator, strategyLocator) { super({ local: 'item', @@ -1070,28 +1091,34 @@ let Repeat = class Repeat extends AbstractRepeater { } } _captureAndRemoveMatcherBinding() { - if (this.viewFactory.viewFactory) { - const instructions = this.viewFactory.viewFactory.instructions; - const instructionIds = Object.keys(instructions); - for (let i = 0; i < instructionIds.length; i++) { - const expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (let ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - const matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + const viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + const template = viewFactory.template; + const instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; + } + const repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; } + const repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; } viewCount() { return this.viewSlot.children.length; } views() { return this.viewSlot.children; } view(index) { return this.viewSlot.children[index]; } - matcher() { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; } + matcher() { + const matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + } addView(bindingContext, overrideContext) { let view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1130,6 +1157,7 @@ let Repeat = class Repeat extends AbstractRepeater { } } }; +Repeat.useInnerMatcher = true; __decorate([ bindable ], Repeat.prototype, "items", void 0); @@ -1142,11 +1170,30 @@ __decorate([ __decorate([ bindable ], Repeat.prototype, "value", void 0); -Repeat = __decorate([ +Repeat = Repeat_1 = __decorate([ customAttribute('repeat'), templateController, inject(BoundViewFactory, TargetInstruction, ViewSlot, ViewResources, ObserverLocator, RepeatStrategyLocator) -], Repeat); +], Repeat); +const extractMatcherBindingExpression = (instructions, targetedElementId) => { + const instructionIds = Object.keys(instructions); + for (let i = 0; i < instructionIds.length; i++) { + const instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + const expressions = instructions[instructionId].expressions; + if (expressions) { + for (let ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + const matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } +}; const aureliaHideClassName = 'aurelia-hide'; const aureliaHideClass = `.${aureliaHideClassName} { display:none !important; }`; diff --git a/dist/es2017/aurelia-templating-resources.js.map b/dist/es2017/aurelia-templating-resources.js.map index b7b5f2f..e51ec18 100644 --- a/dist/es2017/aurelia-templating-resources.js.map +++ b/dist/es2017/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/native-modules/aurelia-templating-resources.js b/dist/native-modules/aurelia-templating-resources.js index ed3580a..0defab7 100644 --- a/dist/native-modules/aurelia-templating-resources.js +++ b/dist/native-modules/aurelia-templating-resources.js @@ -44,8 +44,14 @@ function __decorate(decorators, target, key, desc) { return c > 3 && r && Object.defineProperty(target, key, r), r; } +var ActivationStrategy; +(function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; +})(ActivationStrategy || (ActivationStrategy = {})); var Compose = (function () { function Compose(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -102,6 +108,9 @@ var Compose = (function () { __decorate([ bindable ], Compose.prototype, "viewModel", void 0); + __decorate([ + bindable + ], Compose.prototype, "activationStrategy", void 0); __decorate([ bindable ], Compose.prototype, "swapOrder", void 0); @@ -138,13 +147,7 @@ function createInstruction(composer, instruction) { function processChanges(composer) { var changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { var instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -157,6 +160,12 @@ function processChanges(composer) { composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(function () { completeCompositionTask(composer); @@ -180,6 +189,16 @@ function requestUpdate(composer) { composer.updateRequested = false; processChanges(composer); }); +} +function needsReInitialization(composer, changes) { + var activationStrategy = composer.activationStrategy; + var vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } var IfCore = (function () { @@ -485,21 +504,22 @@ var ArrayRepeatStrategy = (function () { }; ArrayRepeatStrategy.prototype.instanceChanged = function (repeat, items) { var _this = this; + var $repeat = repeat; var itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - var children = repeat.views(); + var children = $repeat.views(); var viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { var childrenSnapshot = children.slice(0); - var itemNameInBindingContext = repeat.local; - var matcher_1 = repeat.matcher(); + var itemNameInBindingContext = $repeat.local; + var matcher_1 = $repeat.matcher(); var itemsPreviouslyInViews_1 = []; var viewsToRemove = []; for (var index = 0; index < viewsLength; index++) { @@ -515,15 +535,15 @@ var ArrayRepeatStrategy = (function () { var updateViews = void 0; var removePromise = void 0; if (itemsPreviouslyInViews_1.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = function () { for (var index = 0; index < itemsLength; index++) { var item = items[index]; var indexOfView = indexOf(itemsPreviouslyInViews_1, item, matcher_1, index); var view = void 0; if (indexOfView === -1) { - var overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + var overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews_1.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -532,7 +552,7 @@ var ArrayRepeatStrategy = (function () { } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews_1.splice(indexOfView, 1); itemsPreviouslyInViews_1.splice(index, 0, undefined); } @@ -540,12 +560,12 @@ var ArrayRepeatStrategy = (function () { updateOverrideContext(view.overrideContext, index, itemsLength); } } - _this._inPlaceProcessItems(repeat, items); + _this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = function () { return _this._standardProcessInstanceChanged(repeat, items); }; + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = function () { return _this._standardProcessInstanceChanged($repeat, items); }; } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -555,7 +575,7 @@ var ArrayRepeatStrategy = (function () { } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } }; ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function (repeat, items) { @@ -1023,6 +1043,7 @@ var Repeat = (function (_super) { _this.viewsRequireLifecycle = viewsRequireLifecycle(viewFactory); return _this; } + Repeat_1 = Repeat; Repeat.prototype.call = function (context, changes) { this[context](this.items, changes); }; @@ -1122,28 +1143,34 @@ var Repeat = (function (_super) { } }; Repeat.prototype._captureAndRemoveMatcherBinding = function () { - if (this.viewFactory.viewFactory) { - var instructions = this.viewFactory.viewFactory.instructions; - var instructionIds = Object.keys(instructions); - for (var i = 0; i < instructionIds.length; i++) { - var expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (var ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - var matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + var viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + var template = viewFactory.template; + var instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; } + var repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; + } + var repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; }; Repeat.prototype.viewCount = function () { return this.viewSlot.children.length; }; Repeat.prototype.views = function () { return this.viewSlot.children; }; Repeat.prototype.view = function (index) { return this.viewSlot.children[index]; }; - Repeat.prototype.matcher = function () { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; }; + Repeat.prototype.matcher = function () { + var matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + }; Repeat.prototype.addView = function (bindingContext, overrideContext) { var view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1181,6 +1208,8 @@ var Repeat = (function (_super) { } } }; + var Repeat_1; + Repeat.useInnerMatcher = true; __decorate([ bindable ], Repeat.prototype, "items", void 0); @@ -1193,13 +1222,32 @@ var Repeat = (function (_super) { __decorate([ bindable ], Repeat.prototype, "value", void 0); - Repeat = __decorate([ + Repeat = Repeat_1 = __decorate([ customAttribute('repeat'), templateController, inject(BoundViewFactory, TargetInstruction, ViewSlot, ViewResources, ObserverLocator, RepeatStrategyLocator) ], Repeat); return Repeat; -}(AbstractRepeater)); +}(AbstractRepeater)); +var extractMatcherBindingExpression = function (instructions, targetedElementId) { + var instructionIds = Object.keys(instructions); + for (var i = 0; i < instructionIds.length; i++) { + var instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + var expressions = instructions[instructionId].expressions; + if (expressions) { + for (var ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + var matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } +}; var aureliaHideClassName = 'aurelia-hide'; var aureliaHideClass = "." + aureliaHideClassName + " { display:none !important; }"; diff --git a/dist/native-modules/aurelia-templating-resources.js.map b/dist/native-modules/aurelia-templating-resources.js.map index 2b4004b..4d87f38 100644 --- a/dist/native-modules/aurelia-templating-resources.js.map +++ b/dist/native-modules/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/system/aurelia-templating-resources.js b/dist/system/aurelia-templating-resources.js index b20828a..4f6f90d 100644 --- a/dist/system/aurelia-templating-resources.js +++ b/dist/system/aurelia-templating-resources.js @@ -98,8 +98,14 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu return c > 3 && r && Object.defineProperty(target, key, r), r; } + var ActivationStrategy; + (function (ActivationStrategy) { + ActivationStrategy["InvokeLifecycle"] = "invoke-lifecycle"; + ActivationStrategy["Replace"] = "replace"; + })(ActivationStrategy || (ActivationStrategy = {})); var Compose = exports('Compose', (function () { function Compose(element, container, compositionEngine, viewSlot, viewResources, taskQueue) { + this.activationStrategy = ActivationStrategy.InvokeLifecycle; this.element = element; this.container = container; this.compositionEngine = compositionEngine; @@ -156,6 +162,9 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu __decorate([ bindable ], Compose.prototype, "viewModel", void 0); + __decorate([ + bindable + ], Compose.prototype, "activationStrategy", void 0); __decorate([ bindable ], Compose.prototype, "swapOrder", void 0); @@ -192,13 +201,7 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu function processChanges(composer) { var changes = composer.changes; composer.changes = Object.create(null); - if (!('view' in changes) && !('viewModel' in changes) && ('model' in changes)) { - composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); - if (!composer.pendingTask) { - return; - } - } - else { + if (needsReInitialization(composer, changes)) { var instruction = { view: composer.view, viewModel: composer.currentViewModel || composer.viewModel, @@ -211,6 +214,12 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu composer.currentViewModel = controller ? controller.viewModel : null; }); } + else { + composer.pendingTask = tryActivateViewModel(composer.currentViewModel, changes.model); + if (!composer.pendingTask) { + return; + } + } composer.pendingTask = composer.pendingTask .then(function () { completeCompositionTask(composer); @@ -234,6 +243,16 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu composer.updateRequested = false; processChanges(composer); }); + } + function needsReInitialization(composer, changes) { + var activationStrategy = composer.activationStrategy; + var vm = composer.currentViewModel; + if (vm && typeof vm.determineActivationStrategy === 'function') { + activationStrategy = vm.determineActivationStrategy(); + } + return 'view' in changes + || 'viewModel' in changes + || activationStrategy === ActivationStrategy.Replace; } var IfCore = (function () { @@ -539,21 +558,22 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu }; ArrayRepeatStrategy.prototype.instanceChanged = function (repeat, items) { var _this = this; + var $repeat = repeat; var itemsLength = items.length; if (!items || itemsLength === 0) { - repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); + $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); return; } - var children = repeat.views(); + var children = $repeat.views(); var viewsLength = children.length; if (viewsLength === 0) { - this._standardProcessInstanceChanged(repeat, items); + this._standardProcessInstanceChanged($repeat, items); return; } - if (repeat.viewsRequireLifecycle) { + if ($repeat.viewsRequireLifecycle) { var childrenSnapshot = children.slice(0); - var itemNameInBindingContext = repeat.local; - var matcher_1 = repeat.matcher(); + var itemNameInBindingContext = $repeat.local; + var matcher_1 = $repeat.matcher(); var itemsPreviouslyInViews_1 = []; var viewsToRemove = []; for (var index = 0; index < viewsLength; index++) { @@ -569,15 +589,15 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu var updateViews = void 0; var removePromise = void 0; if (itemsPreviouslyInViews_1.length > 0) { - removePromise = repeat.removeViews(viewsToRemove, true, !repeat.viewsRequireLifecycle); + removePromise = $repeat.removeViews(viewsToRemove, true, !$repeat.viewsRequireLifecycle); updateViews = function () { for (var index = 0; index < itemsLength; index++) { var item = items[index]; var indexOfView = indexOf(itemsPreviouslyInViews_1, item, matcher_1, index); var view = void 0; if (indexOfView === -1) { - var overrideContext = createFullOverrideContext(repeat, items[index], index, itemsLength); - repeat.insertView(index, overrideContext.bindingContext, overrideContext); + var overrideContext = createFullOverrideContext($repeat, items[index], index, itemsLength); + $repeat.insertView(index, overrideContext.bindingContext, overrideContext); itemsPreviouslyInViews_1.splice(index, 0, undefined); } else if (indexOfView === index) { @@ -586,7 +606,7 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu } else { view = children[indexOfView]; - repeat.moveView(indexOfView, index); + $repeat.moveView(indexOfView, index); itemsPreviouslyInViews_1.splice(indexOfView, 1); itemsPreviouslyInViews_1.splice(index, 0, undefined); } @@ -594,12 +614,12 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu updateOverrideContext(view.overrideContext, index, itemsLength); } } - _this._inPlaceProcessItems(repeat, items); + _this._inPlaceProcessItems($repeat, items); }; } else { - removePromise = repeat.removeAllViews(true, !repeat.viewsRequireLifecycle); - updateViews = function () { return _this._standardProcessInstanceChanged(repeat, items); }; + removePromise = $repeat.removeAllViews(true, !$repeat.viewsRequireLifecycle); + updateViews = function () { return _this._standardProcessInstanceChanged($repeat, items); }; } if (removePromise instanceof Promise) { removePromise.then(updateViews); @@ -609,7 +629,7 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu } } else { - this._inPlaceProcessItems(repeat, items); + this._inPlaceProcessItems($repeat, items); } }; ArrayRepeatStrategy.prototype._standardProcessInstanceChanged = function (repeat, items) { @@ -1077,6 +1097,7 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu _this.viewsRequireLifecycle = viewsRequireLifecycle(viewFactory); return _this; } + Repeat_1 = Repeat; Repeat.prototype.call = function (context, changes) { this[context](this.items, changes); }; @@ -1176,28 +1197,34 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu } }; Repeat.prototype._captureAndRemoveMatcherBinding = function () { - if (this.viewFactory.viewFactory) { - var instructions = this.viewFactory.viewFactory.instructions; - var instructionIds = Object.keys(instructions); - for (var i = 0; i < instructionIds.length; i++) { - var expressions = instructions[instructionIds[i]].expressions; - if (expressions) { - for (var ii = 0; ii < expressions.length; ii++) { - if (expressions[ii].targetProperty === 'matcher') { - var matcherBinding = expressions[ii]; - expressions.splice(ii, 1); - return matcherBinding; - } - } - } + var viewFactory = this.viewFactory.viewFactory; + if (viewFactory) { + var template = viewFactory.template; + var instructions = viewFactory.instructions; + if (Repeat_1.useInnerMatcher) { + return extractMatcherBindingExpression(instructions); + } + if (template.children.length > 1) { + return undefined; } + var repeatedElement = template.firstElementChild; + if (!repeatedElement.hasAttribute('au-target-id')) { + return undefined; + } + var repeatedElementTargetId = repeatedElement.getAttribute('au-target-id'); + return extractMatcherBindingExpression(instructions, repeatedElementTargetId); } return undefined; }; Repeat.prototype.viewCount = function () { return this.viewSlot.children.length; }; Repeat.prototype.views = function () { return this.viewSlot.children; }; Repeat.prototype.view = function (index) { return this.viewSlot.children[index]; }; - Repeat.prototype.matcher = function () { return this.matcherBinding ? this.matcherBinding.sourceExpression.evaluate(this.scope, this.matcherBinding.lookupFunctions) : null; }; + Repeat.prototype.matcher = function () { + var matcherBinding = this.matcherBinding; + return matcherBinding + ? matcherBinding.sourceExpression.evaluate(this.scope, matcherBinding.lookupFunctions) + : null; + }; Repeat.prototype.addView = function (bindingContext, overrideContext) { var view = this.viewFactory.create(); view.bind(bindingContext, overrideContext); @@ -1235,6 +1262,8 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu } } }; + var Repeat_1; + Repeat.useInnerMatcher = true; __decorate([ bindable ], Repeat.prototype, "items", void 0); @@ -1247,13 +1276,32 @@ System.register(['aurelia-dependency-injection', 'aurelia-pal', 'aurelia-task-qu __decorate([ bindable ], Repeat.prototype, "value", void 0); - Repeat = __decorate([ + Repeat = Repeat_1 = __decorate([ customAttribute('repeat'), templateController, inject(BoundViewFactory, TargetInstruction, ViewSlot, ViewResources, ObserverLocator, RepeatStrategyLocator) ], Repeat); return Repeat; - }(AbstractRepeater))); + }(AbstractRepeater))); + var extractMatcherBindingExpression = function (instructions, targetedElementId) { + var instructionIds = Object.keys(instructions); + for (var i = 0; i < instructionIds.length; i++) { + var instructionId = instructionIds[i]; + if (targetedElementId !== undefined && instructionId !== targetedElementId) { + continue; + } + var expressions = instructions[instructionId].expressions; + if (expressions) { + for (var ii = 0; ii < expressions.length; ii++) { + if (expressions[ii].targetProperty === 'matcher') { + var matcherBindingExpression = expressions[ii]; + expressions.splice(ii, 1); + return matcherBindingExpression; + } + } + } + } + }; var aureliaHideClassName = 'aurelia-hide'; var aureliaHideClass = "." + aureliaHideClassName + " { display:none !important; }"; diff --git a/dist/system/aurelia-templating-resources.js.map b/dist/system/aurelia-templating-resources.js.map index 7bd47fd..fee3a6f 100644 --- a/dist/system/aurelia-templating-resources.js.map +++ b/dist/system/aurelia-templating-resources.js.map @@ -1 +1 @@ -{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"aurelia-templating-resources.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index f0dd0f7..1f0d948 100644 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -1,3 +1,17 @@ +# [1.12.0](https://github.com/aurelia/templating-resources/compare/1.11.0...1.12.0) (2019-08-06) + + +### Bug Fixes + +* **repeat:** ensure backward compat, fix tests ([62958e5](https://github.com/aurelia/templating-resources/commit/62958e5)) +* **repeat:** properly find matcher binding ([a579644](https://github.com/aurelia/templating-resources/commit/a579644)) + +### Features + +* **compose:** [@bindable](https://github.com/bindable) activation-strategy ([4078883](https://github.com/aurelia/templating-resources/commit/4078883)), closes [#381](https://github.com/aurelia/templating-resources/issues/381) +* **compose:** activation strategy hook in VM ([3aa3020](https://github.com/aurelia/templating-resources/commit/3aa3020)), closes [#381](https://github.com/aurelia/templating-resources/issues/381) + + # [1.11.0](https://github.com/aurelia/templating-resources/compare/1.10.0...1.11.0) (2019-05-30) diff --git a/package-lock.json b/package-lock.json index 98ff218..66fe7b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "aurelia-templating-resources", - "version": "1.11.0", + "version": "1.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b60af4d..8caaf6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aurelia-templating-resources", - "version": "1.11.0", + "version": "1.12.0", "description": "A standard set of behaviors, converters and other resources for use with the Aurelia templating library.", "keywords": [ "aurelia",