marko/components/ComponentsContext.js
2017-02-20 16:30:16 -07:00

74 lines
2.2 KiB
JavaScript

'use strict';
var ComponentDef = require('./ComponentDef');
var initComponents = require('./init-components');
var EMPTY_OBJECT = {};
function ComponentsContext(out, root) {
if (!root) {
root = new ComponentDef(null, null, out);
}
this.$__out = out;
this.$__componentStack = [root];
this.$__preserved = EMPTY_OBJECT;
this.$__componentsById = {};
}
ComponentsContext.prototype = {
get $__components() {
return this.$__componentStack[0].$__children;
},
$__beginComponent: function(component) {
var self = this;
var componentStack = self.$__componentStack;
var origLength = componentStack.length;
var parent = componentStack[origLength - 1];
var componentId = component.id;
if (!componentId) {
componentId = component.id = parent.$__nextId();
}
var componentDef = new ComponentDef(component, componentId, this.$__out, componentStack, origLength);
this.$__componentsById[componentId] = componentDef;
parent.$__addChild(componentDef);
componentStack.push(componentDef);
return componentDef;
},
$__clearComponents: function () {
this.$__componentStack = [new ComponentDef(null /* id */, this.$__out)];
},
$__initComponents: function (doc) {
var componentDefs = this.$__components;
if (componentDefs) {
initComponents.$__initClientRendered(componentDefs, doc);
this.$__clearComponents();
}
},
$__nextComponentId: function() {
var componentStack = this.$__componentStack;
var parent = componentStack[componentStack.length - 1];
return parent.$__nextId();
},
$__preserveDOMNode: function(elId, bodyOnly) {
var preserved = this.$__preserved ;
if (preserved === EMPTY_OBJECT) {
preserved = this.$__preserved = {};
}
preserved[elId] = { $__bodyOnly: bodyOnly };
}
};
ComponentsContext.$__getComponentsContext = function (out) {
var global = out.global;
return out.data.components ||
global.components ||
(global.components = new ComponentsContext(out));
};
module.exports = ComponentsContext;