mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
74 lines
2.2 KiB
JavaScript
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; |