Files
polymer/lib/mixins/disable-upgrade-mixin.html

87 lines
2.8 KiB
HTML
Raw Normal View History

<!--
@license
Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<script>
(function() {
const DISABLED_ATTR = 'disable-upgrade';
/**
* Element class mixin that allows the element to boot up in a non-enabled
* state when the `disable-upgrade` attribute is present. This mixin is
* designed to be used with element classes like Polymer.Element that perform
* initial startup work when they are first connected. When the
* `disable-upgrade` attribute is removed, if the element is connected, it
* boots up and "enables" as it otherwise would; if it is not connected, the
* element boots up when it is next connected.
*
* Using `disable-upgrade` with Polymer.Element prevents any data propagation
* to the element, any element DOM from stamping, or any work done in
* connected/disconnctedCallback from occuring, but it does not prevent work
* done in the element constructor.
*
* Note, this mixin must be applied on top of any element class that
* itself implements a `connectedCallback` so that it can control the work
* done in `connectedCallback`. For example,
*
* MyClass = Polymer.DisableUpgradeMixin(class extends BaseClass {...});
*
* @mixinFunction
* @polymer
* @memberof Polymer
*/
Polymer.DisableUpgradeMixin = Polymer.dedupingMixin((base) => {
return class DisableUpgradeClass extends base {
static get observedAttributes() {
return super.observedAttributes.concat(DISABLED_ATTR);
}
attributeChangedCallback(name, old, value) {
if (name == DISABLED_ATTR) {
if (!this.__dataEnabled && value == null && this.isConnected) {
super.connectedCallback();
}
} else {
super.attributeChangedCallback(name, old, value);
}
}
__shouldEnable() {
return this.__dataEnabled || !this.hasAttribute(DISABLED_ATTR);
}
// prevent user code in connected from running
connectedCallback() {
if (this.__shouldEnable()) {
super.connectedCallback();
}
}
// prevent element from turning on properties
_enableProperties() {
if (this.__shouldEnable()) {
super._enableProperties();
}
}
// only go if "enabled"
disconnectedCallback() {
if (this.__dataEnabled) {
super.disconnectedCallback();
}
}
}
});
})();
</script>