decojs
Version:
Scalable frontend architecture
51 lines (47 loc) • 1.56 kB
JavaScript
define([], function() {
return {
getViewModelFromAttributes: function(target){
var viewModelName = target.getAttribute("data-viewmodel");
var model = target.getAttribute("data-model");
return {
target: target,
viewModelName: viewModelName,
model: model
};
},
getParentViewModelElement: function(element, maxAncestor){
while(element = element.parentNode){
if(element === maxAncestor) return null;
if(element.hasAttribute("data-viewmodel")) return element;
}
return null;
},
loadViewModel: function(data){
return new Promise(function(resolve, reject){
require([data.viewModelName], resolve, reject);
}).then(function(ViewModel){
return {
viewModelName: data.viewModelName,
ViewModel: ViewModel,
model: data.model,
target: data.target
}
}, function(error){
throw new Error("Could not load the following modules:\n"+error.requireModules.join("\n"));
});
},
createViewModel: function(data, subscribe, params) {
var model = (data.model && (data.model.charAt(0) == '{' || data.model.charAt(0) == '['))
? JSON.parse(data.model)
: params;
var whenContext = subscribe();
var viewModel = new data.ViewModel(model, whenContext);
viewModel['@SymbolDecoWhenContext'] = whenContext;
return {
viewModelName: data.viewModelName,
viewModel: viewModel,
target: data.target
}
}
}
});