primitive dependency resolving while instanciating plugins viewmodels

This commit is contained in:
Teja 2015-02-03 19:12:47 +01:00
parent f6a3cf9821
commit 7e8491804f
5 changed files with 53 additions and 36 deletions

View file

@ -258,7 +258,7 @@ $(function() {
// view model class, identifier, parameters for constructor, container to bind to
ADDITIONAL_VIEWMODELS.push([LaserCutterProfilesViewModel, "laserCutterProfilesViewModel",
ADDITIONAL_VIEWMODELS.push([LaserCutterProfilesViewModel,
["workingAreaViewModel", "controlViewModel", "vectorConversionViewModel"],
document.getElementById("laserCutterProfiles")]);

View file

@ -297,7 +297,7 @@ $(function(){
}
ADDITIONAL_VIEWMODELS.push([VectorConversionViewModel, "vectorConversionViewModel",
ADDITIONAL_VIEWMODELS.push([VectorConversionViewModel,
["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "workingAreaViewModel", "gcodeFilesViewModel"],
document.getElementById("dialog_vector_graphics_conversion")]);

View file

@ -9,20 +9,11 @@ $(function(){
self.settings = params[1];
self.state = params[2];
self.files = params[3];
self.conversion = params[4];
self.log = [];
self.command = ko.observable(undefined);
// self.isErrorOrClosed = ko.observable(undefined);
// self.isOperational = ko.observable(undefined);
// self.isPrinting = ko.observable(undefined);
// self.isPaused = ko.observable(undefined);
// self.isError = ko.observable(undefined);
// self.isReady = ko.observable(undefined);
// self.isLoading = ko.observable(undefined);
self.availableHeight = ko.observable(undefined);
self.availableWidth = ko.observable(undefined);
self.px2mm_factor = 1; // initial value
@ -380,7 +371,7 @@ $(function(){
GCODE.workingArea = self; // Temporary hack to use the gcode parser from the gCodeViewer
self.state.workingArea = self;
self.files.workingArea = self;
self.conversion.workingArea = self;
$(window).resize(function(){
self.trigger_resize();
});
@ -391,8 +382,8 @@ $(function(){
// view model class, parameters for constructor, container to bind to
ADDITIONAL_VIEWMODELS.push([WorkingAreaViewModel, "workingAreaViewModel",
["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "gcodeFilesViewModel", "vectorConversionViewModel"],
ADDITIONAL_VIEWMODELS.push([WorkingAreaViewModel,
["loginStateViewModel", "settingsViewModel", "printerStateViewModel", "gcodeFilesViewModel"],
[document.getElementById("area_preview"), document.getElementById("working_area_files")]]);
});

View file

@ -71,7 +71,7 @@ $(function() {
var terminalViewModel = new TerminalViewModel(loginStateViewModel, settingsViewModel);
var slicingViewModel = new SlicingViewModel(loginStateViewModel, printerProfilesViewModel);
var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel, null, null);
var gcodeFilesViewModel = new GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel);
var controlViewModel = new ControlViewModel(loginStateViewModel, settingsViewModel, printerStateViewModel);
var navigationViewModel = new NavigationViewModel(loginStateViewModel, appearanceViewModel, settingsViewModel, usersViewModel);
var logViewModel = new LogViewModel(loginStateViewModel);
@ -96,32 +96,58 @@ $(function() {
slicingViewModel: slicingViewModel,
};
var allViewModels = _.values(viewModelMap);
var additionalViewModels = [];
_.each(ADDITIONAL_VIEWMODELS, function(viewModel) {
var viewModelClass = viewModel[0];
var viewModelId = viewModel[1];
var viewModelParameters = viewModel[2];
var viewModelBindTarget = viewModel[3];
var _createViewModelInstance = function(viewModel, viewModelMap){
var viewModelClass = viewModel[0];
var viewModelParameters = viewModel[1];
var constructorParameters = [];
_.each(viewModelParameters, function(parameter) {
for (var idx = 0; idx < viewModelParameters.length; idx++) {
var parameter = viewModelParameters[idx];
if (_.has(viewModelMap, parameter)) {
constructorParameters.push(viewModelMap[parameter]);
} else {
constructorParameters.push(undefined);
}
});
var viewModelInstance = new viewModelClass(constructorParameters);
additionalViewModels.push([viewModelInstance, viewModelBindTarget]);
allViewModels.push(viewModelInstance);
viewModelMap[viewModelId] = viewModelInstance;
});
console.warn("postponing", viewModel[0].name, 'missing param: ', parameter);
return;
}
}
var viewModelInstance = new viewModelClass(constructorParameters);
return viewModelInstance;
};
var _getViewModelId = function(viewModel){
var name = viewModel[0].name;
return name.substr(0, 1).toLowerCase() + name.substr(1);
};
var vmtmp = ADDITIONAL_VIEWMODELS.slice();
var additionalViewModels = [];
var attempt = 0;
while(vmtmp.length > 0 && attempt < 3){
while(vmtmp.length > 0){
var viewModel = vmtmp.shift();
var viewModelInstance = _createViewModelInstance(viewModel, viewModelMap);
if(viewModelInstance !== undefined){
var viewModelBindTarget = viewModel[2];
var viewModelId = _getViewModelId(viewModel);
if(viewModelMap[viewModelId] !== undefined){
console.error("Duplicate class name while instantiating viewModel ", viewModelId);
} else {
additionalViewModels.push([viewModelInstance, viewModelBindTarget]);
viewModelMap[viewModelId] = viewModelInstance;
}
} else {
vmtmp.push(viewModel);
}
}
attempt++;
}
var allViewModels = _.values(viewModelMap);
var dataUpdater = new DataUpdater(allViewModels);
//~~ Temperature
$('#tabs a[data-toggle="tab"]').on('shown', function (e) {

View file

@ -1,11 +1,11 @@
function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel, vectorConversionViewModel, workingAreaViewModel) {
function GcodeFilesViewModel(printerStateViewModel, loginStateViewModel, slicingViewModel) {
var self = this;
self.printerState = printerStateViewModel;
self.loginState = loginStateViewModel;
self.slicing = slicingViewModel;
//self.conversion = vectorConversionViewModel;
self.workingArea = workingAreaViewModel;
self.conversion = undefined;
self.workingArea = undefined;
self.isErrorOrClosed = ko.observable(undefined);
self.isOperational = ko.observable(undefined);