todomvc
Version:
> Helping you select an MV\* framework
83 lines (74 loc) • 2.14 kB
JavaScript
/*!
* CanJS - 2.0.3
* http://canjs.us/
* Copyright (c) 2013 Bitovi
* Tue, 26 Nov 2013 18:21:22 GMT
* Licensed MIT
* Includes: CanJS default build
* Download from: http://canjs.us/
*/
define(["can/util/library", "can/map/attributes"], function(can) {
/**
* @function can.classize can.classize
* @parent can.Map.setter
* @plugin can/map/setter
*
* @description Make a string into a class name.
*
* @signature `can.classize(str)`
*
* `can.classize` splits a string by underscores or
* dashes and capitalizes each part before joining
* them back together. This method is useful for
* taking HTML class names and getting the original
* Control name from them.
*
* @codestart
* can.classize('my_control_name'); // 'MyControlName'
* @codeend
* @param {String} str The string to transform.
* @return {String} The string as a class name.
*/
can.classize = function( s , join) {
// this can be moved out ..
// used for getter setter
var parts = s.split(can.undHash),
i = 0;
for (; i < parts.length; i++ ) {
parts[i] = can.capitalize(parts[i]);
}
return parts.join(join || '');
}
var classize = can.classize,
proto = can.Map.prototype,
old = proto.__set;
proto.__set = function(prop, value, current, success, error){
// check if there's a setter
var cap = classize(prop),
setName = "set" + cap,
errorCallback = function( errors ) {
var stub = error && error.call(self, errors);
// if 'setter' is on the page it will trigger
// the error itself and we dont want to trigger
// the event twice. :)
if(stub !== false){
can.trigger(self, "error", [prop, errors], true);
}
return false;
},
self = this;
// if we have a setter
if ( this[setName] &&
// call the setter, if returned value is undefined,
// this means the setter is async so we
// do not call update property and return right away
( value = this[setName](value,
function(value ){ old.call(self,prop, value, current, success, errorCallback) },
errorCallback ) ) === undefined ) {
return;
}
old.call(self,prop, value, current, success, errorCallback);
return this;
};
return can.Map;
});