You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
// Wreqr.Commands
|
|
// --------------
|
|
//
|
|
// A simple command pattern implementation. Register a command
|
|
// handler and execute it.
|
|
Wreqr.Commands = (function(Wreqr, _){
|
|
"use strict";
|
|
|
|
return Wreqr.Handlers.extend({
|
|
// default storage type
|
|
storageType: Wreqr.CommandStorage,
|
|
|
|
constructor: function(options){
|
|
this.options = options || {};
|
|
|
|
this._initializeStorage(this.options);
|
|
this.on("handler:add", this._executeCommands, this);
|
|
|
|
Wreqr.Handlers.prototype.constructor.apply(this, arguments);
|
|
},
|
|
|
|
// Execute a named command with the supplied args
|
|
execute: function(name){
|
|
name = arguments[0];
|
|
var args = _.rest(arguments);
|
|
|
|
if (this.hasHandler(name)){
|
|
this.getHandler(name).apply(this, args);
|
|
} else {
|
|
this.storage.addCommand(name, args);
|
|
}
|
|
|
|
},
|
|
|
|
// Internal method to handle bulk execution of stored commands
|
|
_executeCommands: function(name, handler, context){
|
|
var command = this.storage.getCommands(name);
|
|
|
|
// loop through and execute all the stored command instances
|
|
_.each(command.instances, function(args){
|
|
handler.apply(context, args);
|
|
});
|
|
|
|
this.storage.clearCommands(name);
|
|
},
|
|
|
|
// Internal method to initialize storage either from the type's
|
|
// `storageType` or the instance `options.storageType`.
|
|
_initializeStorage: function(options){
|
|
var storage;
|
|
|
|
var StorageType = options.storageType || this.storageType;
|
|
if (_.isFunction(StorageType)){
|
|
storage = new StorageType();
|
|
} else {
|
|
storage = StorageType;
|
|
}
|
|
|
|
this.storage = storage;
|
|
}
|
|
});
|
|
|
|
})(Wreqr, _);
|