Skip to content

Instantly share code, notes, and snippets.

@gobwas
Created September 30, 2013 09:50
Show Gist options
  • Save gobwas/6761610 to your computer and use it in GitHub Desktop.
Save gobwas/6761610 to your computer and use it in GitHub Desktop.
"is" function for smacss.
/**
* 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