Skip to content

Instantly share code, notes, and snippets.

@yreynhout
Created August 4, 2012 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yreynhout/3256834 to your computer and use it in GitHub Desktop.
Save yreynhout/3256834 to your computer and use it in GitHub Desktop.
Viewmodels - Sample 2
var ThingInputViewModel=function() {
if(!this instanceof ThingInputViewModel) {
return new ThingInputViewModel();
}
var states={ none: 0, adding: 1,modifying: 2 };
var self=this,
statemachine=new SimpleStatemachine({ initialState: states.none }),
baseData,
initializeInput,
buildCommand,
cancelAdd,
cancelModify;
self.Name=new TextInput({
rules: {
required: true,
minLength: ns.MetaData.Name.MinimumLength,
maxLength: ns.MetaData.Name.MaximumLength
},
messages: {
required: ns.Resources.FieldIsRequired,
minLength: ns.Resources.MustHaveMinimumLength,
maxLength: ns.Resources.MustNotExceedMaximumLength
}
});
self.Save=new Trigger();
self.Cancel=new Trigger();
self.enable=function() {
self.Save.enable();
self.Cancel.enable();
self.Name.enable();
};
self.disable=function() {
self.Save.disable();
self.Cancel.disable();
self.Name.disable();
};
self.installController=function(controller) {
self.Save.setCallback(function() {
controller.saveItem(baseData.Id);
});
};
self.Cancel.setCallback(function() {
if(statemachine.isState(states.adding)) {
cancelAdd();
} else {
cancelModify();
}
});
cancelAdd=function() {
self.clear();
};
cancelModify=function() {
self.Name.reset();
};
self.clear=function() {
statemachine.setState(states.none);
baseData=null;
self.disable();
self.Name.clear();
self.Name.unfocus();
};
self.addItem=function(initialData) {
statemachine.setState(states.adding);
self.Name.clear();
initializeInput(initialData);
self.enable();
self.Name.focus();
};
self.modifyItem=function(initialData) {
statemachine.setState(states.modifying);
self.Name.clear();
initializeInput(initialData);
self.enable();
};
initializeInput=function(initialData) {
baseData=initialData;
self.Name.setValue(baseData.Name);
};
self.hasChanges=function() {
if(statemachine.isState(states.none)) return false;
if(statemachine.isState(states.adding)) return true;
return self.Name.isChanged();
};
self.getChanges=function() {
if(!self.hasChanges()) {
return [];
}
return [buildCommand()];
};
self.validate=function(queryService, options) {
options = options || { };
options.valid = options.valid || function() { };
options.invalid = options.invalid || function() { };
var isNameValid = self.Name.validate();
queryService.validateNameUniqueness(baseData.Id, self.Name.getValue(), function(isUnique) {
if (isUnique) {
if (isNameValid) {
options.valid();
} else {
options.invalid();
}
} else {
self.Name.invalidate(ns.Resources.NameIsNotUnique);
options.invalid();
}
});
};
buildCommand=function() {
var message={
Id: baseData.Id,
Name: self.Name.getValue()
};
var command=null;
if(statemachine.isState(states.adding)) {
command=new Command("RegisterNewThingCommand",message);
} else if(statemachine.isState(states.modifying)) {
command=new Command("CorrectNameOfThingCommand",message);
}
return command;
};
self.clear();
return self;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment