-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathtemplaterComponent.js
executable file
·92 lines (74 loc) · 2.75 KB
/
templaterComponent.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
module.exports = function(fastn, component, type, settings, children){
var itemModel = new fastn.Model({});
if(!('template' in settings)){
console.warn('No "template" function was set for this templater component');
}
function replaceElement(element){
if(component.element && component.element.parentNode){
component.element.parentNode.replaceChild(element, component.element);
}
component.element = element;
}
function update(){
var value = component.data(),
template = component.template();
itemModel.set('item', value);
var newComponent;
if(template){
newComponent = fastn.toComponent(template(itemModel, component.scope(), component._currentComponent));
}
if(component._currentComponent && component._currentComponent !== newComponent){
if(fastn.isComponent(component._currentComponent)){
component._currentComponent.destroy();
}
}
component._currentComponent = newComponent;
if(!newComponent){
replaceElement(component.emptyElement);
return;
}
if(fastn.isComponent(newComponent)){
if(component._settings.attachTemplates !== false){
newComponent.attach(itemModel, 2);
}else{
newComponent.attach(component.scope(), 1);
}
if(component.element && component.element !== newComponent.element){
if(newComponent.element == null){
newComponent.render();
}
replaceElement(component._currentComponent.element);
}
}
}
component.render = function(){
var element;
component.emptyElement = document.createTextNode('');
if(component._currentComponent){
component._currentComponent.render();
element = component._currentComponent.element;
}
component.element = element || component.emptyElement;
component.emit('render');
return component;
};
component.setProperty('data',
fastn.property(undefined, settings.dataChanges || 'value structure')
.on('change', update)
);
component.setProperty('template',
fastn.property(undefined, 'value reference')
.on('change', update)
);
component.on('destroy', function(){
if(fastn.isComponent(component._currentComponent)){
component._currentComponent.destroy();
}
});
component.on('attach', function(data){
if(fastn.isComponent(component._currentComponent)){
component._currentComponent.attach(component.scope(), 1);
}
});
return component;
};