diff --git a/src/core/a-entity.js b/src/core/a-entity.js index 014bee38a2f..cce98be2f64 100644 --- a/src/core/a-entity.js +++ b/src/core/a-entity.js @@ -11,6 +11,17 @@ var MULTIPLE_COMPONENT_DELIMITER = '__'; var OBJECT3D_COMPONENTS = ['position', 'rotation', 'scale', 'visible']; var ONCE = {once: true}; +var _resolveReadyPromise; +var isReady = false; +var isReadyPromise = new Promise(function (resolve) { + _resolveReadyPromise = resolve; +}); + +function ready () { + isReady = true; + _resolveReadyPromise(); +} + /** * Entity is a container object that components are plugged into to comprise everything in * the scene. In A-Frame, they inherently have position, rotation, and scale. @@ -67,6 +78,12 @@ class AEntity extends ANode { return; } + if (!isReady) { + isReadyPromise.then( + AEntity.prototype.doConnectedCallback.bind(this) + ); + return; + } AEntity.prototype.doConnectedCallback.call(this); } @@ -868,6 +885,7 @@ function getRotation (entityEl) { AEntity.componentsUpdated = []; AEntity.singlePropUpdate = {}; +AEntity.ready = ready; customElements.define('a-entity', AEntity); diff --git a/src/index.js b/src/index.js index a517c5b4726..df21c6b6faf 100644 --- a/src/index.js +++ b/src/index.js @@ -62,8 +62,6 @@ if (utils.device.isBrowserEnvironment) { require('./style/rStats.css'); } -// Required before `AEntity` so that all components are registered. -var AScene = require('./core/scene/a-scene').AScene; var components = require('./core/component').components; var registerComponent = require('./core/component').registerComponent; var registerGeometry = require('./core/geometry').registerGeometry; @@ -81,8 +79,16 @@ require('./components/index'); // Register standard components. require('./geometries/index'); // Register standard geometries. require('./shaders/index'); // Register standard shaders. require('./systems/index'); // Register standard systems. +// Required before `AEntity` so that all components are registered. +var AScene = require('./core/scene/a-scene').AScene; var ANode = require('./core/a-node').ANode; var AEntity = require('./core/a-entity').AEntity; // Depends on ANode and core components. +setTimeout(function () { + if (window.AFRAME_ASYNC) { + return; + } + AEntity.ready(); +}, 0); require('./core/a-assets'); require('./core/a-cubemap'); @@ -106,6 +112,7 @@ module.exports = window.AFRAME = { components: components, coreComponents: Object.keys(components), geometries: require('./core/geometry').geometries, + ready: AEntity.ready.bind(AEntity), registerComponent: registerComponent, registerGeometry: registerGeometry, registerPrimitive: registerPrimitive,