Before
Polymer.dom(this.root)After
this.shadowRootBefore
this.domHostAfter
this.getRootNode().hostBefore
this.$$('some-selector');After
this.shadowRoot.querySelector('some-selector')Before
Polymer.dom(this).getOwnerRoot()After
this.getRootNode()Before
Polymer.dom(event).localTargetAfter
event.targetBefore
Polymer.dom(event).pathAfter
event.composedPath()Before
Polymer.dom(event).rootTargetAfter
event.composedPath()[0]Before
Polymer.dom(this).observeNodes(this._nodesChanged)After
<link rel="import" href="/bower_components/polymer/lib/utils/flattened-nodes-observer.html">
this._observer = new Polymer.FlattenedNodesObserver(this, this._nodesChanged);
this._observer.disconnect();Before
this.getComputedStyleValue()After
For now, need to use custom ShadyCSS API when the polyfill is loaded:
if (window.ShadyCSS) {
style = ShadyCSS.getComputedStyleValue(el, '--something');
} else {
style = getComputedStyle(el).getPropertyValue('--something');
}An issue exists at webcomponents/shadycss#83 to improve the fidelity of the polyfill by patching the native window.getComputedStyle to do the good thing without a conditional.
Before
this.getContentChildrenAfter
Just write the platform code that will do this: find the slot, get the assignedNodes, and filter down to just the elements (ignore comments & text nodes):
this.shadowRoot
.querySelector('slot')
.assignedNodes({flatten:true})
.filter(n => n.nodeType === Node.ELEMENT_NODE)Before
this.getEffectiveChildrenAfter
Use Polymer.FlattenedNodesObserver's getFlattenedNodes helper method, and filter them down to just the elements (ignore comments & text nodes):
<link rel="import" href="polymer/lib/utils/flattened-nodes-observer.html">let effectiveChildren = Polymer.FlattenedNodesObserver.getFlattenedNodes(this)
.filter(n => n.nodeType === Node.ELEMENT_NODE)Before
this.getComputedStyleValue('--something');After This inconvenience is known: webcomponents/shadycss#83
if (window.ShadyCSS) {
style = ShadyCSS.getComputedStyleValue(this, '--something');
} else {
style = getComputedStyle(this).getPropertyValue('--something');
}Before
this.customStyle['--my-dynamic-property'] = 'red';
this.updateStyles();After
this.updateStyles({'--my-dynamic-property': 'red'});Before
this.async(function() { /* ... */}, 100);After
setTimout(() => { /* ... */}, 100);Before
this.fire('some-event');After
// composed: true => bubble across the boundary between the shadow DOM and the regular DOM
this.dispatchEvent(new CustomEvent('some-event', { detail: {}, bubbles: true, composed: true }));Before
this.mixin(target, source);After
mixin(target, source) {
for (var i in source) {
target[i] = source[i];
}
return target;
}
// If copying enumerable and own properties is enough (option defaults for example)
Object.assign(target, ...sources)Before
hostAttributes: {
'tabindex': '0'
}After
this._ensureAttribute('tabindex', '0');Before
this.debounce('debouncerJob', function() {}, 100);After
<link rel="import" href="bower_components/polymer/lib/utils/debounce.html">this._debouncer = Polymer.Debouncer.debounce(this._debouncer,
Polymer.Async.timeOut.after(250),
() => { this.doSomething() });Before
<link rel="import" href="polymer/polymer.html">
<button on-tap="handler">I react to a gesture event</button>After
<link rel="import" href="polymer/polymer.html">
<link rel="import" href="polymer/lib/mixins/gesture-event-listeners.html">class TestEvent extends Polymer.GestureEventListeners(Polymer.Element) {
...
// To imperatively adding a listener
addListener() {
Polymer.Gestures.addListener(this, 'track', e => this.trackHandler(e));
}
}