-
Notifications
You must be signed in to change notification settings - Fork 2
/
control.js
98 lines (82 loc) · 2.63 KB
/
control.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// goog.mvc 0.4
// (c) 2012 Rhys Brett-Bowen, Catch.com
// goog.mvc may be freely distributed under the MIT license.
// For all details and documentation:
// https://github.com/rhysbrettbowen/goog.mvc
goog.provide('mvc.Control');
goog.require('goog.dom');
goog.require('goog.object');
goog.require('goog.ui.Component');
/**
* instantiate with a mvc.Model
*
* @constructor
* @param {mvc.Model} model
* @extends {goog.ui.Component}
*/
mvc.Control = function(model) {
this.setModel(model);
};
/**
* Functions that can be passed to the mvc.Model.bind
*
* @enum {Function}
*/
mvc.Control.Fn = {
TEXT: goog.dom.setTextContent,
VAL: function(el, val) {el.value = val;},
CLASS: goog.dom.classes.add
};
goog.inherits(mvc.Control, goog.ui.Component);
// backbone.js views are just like goog.ui.component, this is more of an interface
/**
* remove the element and dispose
*/
mvc.Control.prototype.remove = function() {
goog.dom.removeNode(this.getElement());
this.dispose();
};
mvc.Control.prototype.render = function(parent) {
this.decorate(parent);
return this;
};
mvc.Control.prototype.init = goog.abstractMethod;
mvc.Control.prototype.createDom = function() {
this.setElementInternal(goog.dom.createDom("DIV"));
};
mvc.Control.prototype.enterDocument = function() {
this.init();
};
/**
* pass an object where the key is "eventType .className" and the value is the
* event handler function
* example:
* var events = {}
* goog.object.set(events, goog.events.EventType.CLICK+" ."+goog.getCssName('button'), function(e) {alert("hello");});
*
* @param {Object.<string, Function>} events
*/
mvc.Control.prototype.delegateEvents = function(events) {
goog.object.forEach(events, function(val, key) {
goog.events.listen(this.getElement(), key.replace(/\s.*/,''), function(e) {
if(goog.dom.classes.has(e.target, key.replace(/.*\./,'')))
events[key](e);
}, false, this);
}, this);
};
/**
* pass in a string like "#elementId", ".className" or "tagName[ .className]"
* to get array of elements with the id, class or tag and class name
*
* @param {string} selector
* @return {?goog.array.ArrayLike}
*/
mvc.Control.prototype.getEls = function(selector) {
if(selector.charAt(0) == '.') {
return goog.dom.getElementsByClass(selector.substring(1), /** @type {Element} */(this.getElement())) || [];
}
if(selector.charAt(0) == '#') {
return [goog.dom.getElement(selector)];
}
return goog.dom.getElementsByTagNameAndClass(selector.replace(/\s.*/,''), selector.replace(/.*\./,'')||null, /** @type {Element} */(this.getElement()));
};