Skip to content

Commit 27ed93a

Browse files
committed
dom-if/dom-repeat bind-to-parent
1 parent 5b8284e commit 27ed93a

File tree

5 files changed

+33
-14
lines changed

5 files changed

+33
-14
lines changed

lib/elements/dom-if.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ export class DomIf extends PolymerElement {
182182
// Guard against element being detached while render was queued
183183
if (parentNode) {
184184
if (!this.__ctor) {
185-
let template = /** @type {HTMLTemplateElement} */(wrap(this).querySelector('template'));
185+
let template = this._templateInfo ? this : /** @type {HTMLTemplateElement} */(wrap(this).querySelector('template'));
186186
if (!template) {
187187
// Wait until childList changes and template should be there by then
188188
let observer = new MutationObserver(() => {

lib/elements/dom-repeat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ export class DomRepeat extends domRepeatBase {
339339
// until ready, since won't have its template content handed back to
340340
// it until then
341341
if (!this.__ctor) {
342-
let template = this.template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
342+
let template = this.template = this._templateInfo ? this : /** @type {HTMLTemplateElement} */(this.querySelector('template'));
343343
if (!template) {
344344
// // Wait until childList changes and template should be there by then
345345
let observer = new MutationObserver(() => {

lib/mixins/property-effects.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { PropertyAccessors } from './property-accessors.js';
2121
import { TemplateStamp } from './template-stamp.js';
2222
import { sanitizeDOMValue, legacyUndefined, legacyNoBatch, legacyNotifyOrder, orderedComputed } from '../utils/settings.js';
2323

24+
const btp = window.location.search.match(/btp/);
25+
2426
// Monotonically increasing unique ID used for de-duping effects triggered
2527
// from multiple properties in the same turn
2628
let dedupeId = 0;
@@ -2919,8 +2921,16 @@ export const PropertyEffects = dedupingMixin(superClass => {
29192921
// Change back to just super.methodCall()
29202922
let noted = propertyEffectsBase._parseTemplateNestedTemplate.call(
29212923
this, node, templateInfo, nodeInfo);
2924+
const parent = node.parentNode;
2925+
const nestedTemplateInfo = nodeInfo.templateInfo;
2926+
if (btp && parent.localName.match(/(dom-repeat|dom-if)/)) {
2927+
parent.removeChild(node);
2928+
nodeInfo.parentInfo.templateInfo = nestedTemplateInfo;
2929+
nodeInfo = nodeInfo.parentInfo;
2930+
noted = false;
2931+
}
29222932
// Merge host props into outer template and add bindings
2923-
let hostProps = nodeInfo.templateInfo.hostProps;
2933+
let hostProps = nestedTemplateInfo.hostProps;
29242934
let mode = '{';
29252935
for (let source in hostProps) {
29262936
let parts = [{ mode, source, dependencies: [source], hostProp: true }];

lib/utils/settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export const setAllowTemplateFromDomModule = function(allowDomModule) {
127127
* If no includes or relative urls are used in styles, these steps can be
128128
* skipped as an optimization.
129129
*/
130-
export let legacyOptimizations = false;
130+
export let legacyOptimizations = window.Polymer && window.Polymer.legacyOptimizations || false;
131131

132132
/**
133133
* Sets `legacyOptimizations` globally for all elements to enable optimizations

lib/utils/templatize.js

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -368,17 +368,22 @@ function createTemplatizerClass(template, templateInfo, options) {
368368
function addPropagateEffects(template, templateInfo, options, methodHost) {
369369
let userForwardHostProp = options.forwardHostProp;
370370
if (userForwardHostProp && templateInfo.hasHostProps) {
371+
const isTemplate = template.localName == 'template';
371372
// Provide data API and property effects on memoized template class
372373
let klass = templateInfo.templatizeTemplateClass;
373374
if (!klass) {
374375
/**
375376
* @constructor
376377
* @extends {DataTemplate}
377378
*/
378-
let templatizedBase = options.mutableData ? MutableDataTemplate : DataTemplate;
379-
/** @private */
380-
klass = templateInfo.templatizeTemplateClass =
381-
class TemplatizedTemplate extends templatizedBase {};
379+
if (isTemplate) {
380+
let templatizedBase = options.mutableData ? MutableDataTemplate : DataTemplate;
381+
/** @private */
382+
klass = templateInfo.templatizeTemplateClass =
383+
class TemplatizedTemplate extends templatizedBase {};
384+
} else {
385+
klass = class TemplatizedTemplateExtension extends template.constructor {};
386+
}
382387
// Add template - >instances effects
383388
// and host <- template effects
384389
let hostProps = templateInfo.hostProps;
@@ -392,19 +397,23 @@ function addPropagateEffects(template, templateInfo, options, methodHost) {
392397
warnOnUndeclaredProperties(templateInfo, options, methodHost);
393398
}
394399
}
395-
upgradeTemplate(template, klass);
400+
if (isTemplate) {
401+
upgradeTemplate(template, klass);
402+
// Clear any pending data for performance
403+
template.__dataTemp = {};
404+
template.__dataPending = null;
405+
template.__dataOld = null;
406+
template._enableProperties();
407+
} else {
408+
Object.setPrototypeOf(template, klass.prototype);
409+
}
396410
// Mix any pre-bound data into __data; no need to flush this to
397411
// instances since they pull from the template at instance-time
398412
if (template.__dataProto) {
399413
// Note, generally `__dataProto` could be chained, but it's guaranteed
400414
// to not be since this is a vanilla template we just added effects to
401415
Object.assign(template.__data, template.__dataProto);
402416
}
403-
// Clear any pending data for performance
404-
template.__dataTemp = {};
405-
template.__dataPending = null;
406-
template.__dataOld = null;
407-
template._enableProperties();
408417
}
409418
}
410419
/* eslint-enable valid-jsdoc */

0 commit comments

Comments
 (0)