Created
September 30, 2013 09:50
-
-
Save gobwas/6761610 to your computer and use it in GitHub Desktop.
"is" function for smacss.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* My Module. | |
* | |
* @package | |
* @author Sergey Kamardin <[email protected]> | |
*/ | |
define( | |
[ | |
], | |
function() { | |
// List of view options to be merged as properties. | |
var viewOptions = ['module', 'router', 'lexicon']; | |
var AbstractView = Backbone.View.extend({ | |
constructor: function(options) { | |
// Pickup predefined options | |
_.extend(this, _.pick(options, viewOptions)); | |
Backbone.View.prototype.constructor.apply(this, arguments); | |
}, | |
/** | |
* Мощная функция установки стейта. | |
* | |
* @param namespace | |
* @param [key] | |
* @param [value] | |
*/ | |
is: (function() { | |
var stateNameGen = function(namespace, key, delimeter) { | |
var ns = namespace == "global" ? "" : namespace; | |
delimeter || (delimeter = "-"); | |
return ["is", ns, key].join(delimeter); | |
}; | |
var setClass = function(selector, namespace, key, value) { | |
var className = stateNameGen(namespace, key), | |
element = selector == "self" ? this.$el : this.$(selector); | |
if (value) { | |
element.addClass(className); | |
} else { | |
element.removeClass(className); | |
} | |
}; | |
var setState = function(selector, namespace, key, value) { | |
this._state || (this._state = {}); | |
this._state[selector] || (this._state[selector] = {}); | |
this._state[selector][namespace] || (this._state[selector][namespace] = {}); | |
this._state[selector][namespace][key] = value; | |
if (selector == "self") { | |
this.trigger(stateNameGen(namespace, key, ':'), value); | |
} | |
}; | |
return function(context, flag) { | |
var selector, namespace, key, value; | |
if (_.isString(context)) { | |
selector = "self"; | |
namespace = "global"; | |
key = context; | |
value = _.isBoolean(flag) ? flag : null; | |
} else { | |
selector = context.selector || "self"; | |
namespace = context.namespace || "global"; | |
key = context.key; | |
value = _.isBoolean(context.value) ? context.value : null; | |
} | |
if (_.isNull(value)) { | |
return this._state && this._state[selector] && this._state[selector][namespace] && this._state[selector][namespace][key]; | |
} | |
if (this._state && this._state[selector]) _.each(this._state[selector][namespace], function(value, oldKey) { | |
if (value === true && key != oldKey) { | |
setState.call(this, selector, namespace, oldKey, false); | |
setClass.call(this, selector, namespace, oldKey, false); | |
} | |
}, this); | |
setState.call(this, selector, namespace, key, value); | |
setClass.call(this, selector, namespace, key, value); | |
return this; | |
} | |
})() | |
}); | |
return AbstractView; | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment