| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- "use strict";
- (function($) {
- $(document).ready(function() {
- var eventBinders = {
- menuExample: function() {
- console.log('eventBinder for menuExample', this);
- this.$elem.find('a').click(function(e) {
- e.preventDefault();
- var $link = $(this);
- console.log('menu item clicked', $link.prop('href'));
- var originalColor = $link.css('backgroundColor');
- // self.toggleMenu();
- $link.animate({
- backgroundColor: '#aaa',
- }, 70);
- $link.animate({
- backgroundColor: originalColor,
- }, 70);
- _ws.navigator.navigateTo($link.prop('href'));
- });
- }
- }
- /**
- * Render an UI part
- */
- function renderPart(partName, data) {
- var part = _ws.ui[partName];
- part.$elem.html( Mustache.render( part.tmpl, data ) );
- }
- _ws.makeView = function(elemId, props) {
- var v = {};
- props = props || {};
- v.$elem = $('#' + elemId);
- v.partName = _.camelCase(elemId);
- _ws.ui[v.partName] = v;
- // Assign a default render function if none given
- if(! props.render) {
- var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
- v.tmpl = $tmplEl.html();
- v.render = (function(data) {
- var eventBinder = eventBinders[v.partName];
- this.$elem.html( Mustache.render( this.tmpl, data ) );
- if(eventBinder) {
- eventBinder = eventBinder.bind(this);
- console.log('bind events for', v.partName);
- eventBinder();
- }
- }).bind(v);
- }
- // Otherwise bind the provided one
- else {
- v.render = props.render.bind(v);
- }
- // Set event handlers
- if(props.events) {
- for(var descriptor in props.events) {
- var handler = props.events[descriptor];
- var bits = descriptor.split(' ');
- var evtName = bits.shift();
- var selector = bits.join(' ');
- console.log('#### bind', descriptor, 'e:' + evtName, 's:' + selector, handler.toString())
- v.$elem.on(evtName, handler);
- }
- }
- }
- /**
- * Initialize an empty object to be populated as follows:
- * - key is an UI element's id
- * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
- */
- _ws.ui = {};
- // Iterate over the template script elements
- var $templateElems = $('script[data-tmpl-for]');
- $templateElems.each(function(idx, el) {
- return;
- // Get the script element content and target element id
- var $script = $(el);
- var tmpl = $script.html();
- var elemId = $script.data('tmpl-for');
- var $elem = $('#' + elemId);
- var partName = _.camelCase(elemId);
- // Populate the uiParts object
- _ws.ui[partName] = {
- tmpl: tmpl,
- $elem: $elem,
- render: (function(_name) {
- return function(data) {
- var eventBinder = eventBinders[_name];
- renderPart(_name, data);
- if(eventBinder) {
- eventBinder = eventBinder.bind(this);
- console.log('bind events for', _name);
- eventBinder();
- }
- };
- })(partName)
- };
- });
- // console.log(_.map(_ws.uiParts, p => (p.render.toString())));
- });
- })(jQuery);
|