ws-ui-parts.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. (function($) {
  3. $(document).ready(function() {
  4. var eventBinders = {
  5. menuExample: function() {
  6. console.log('eventBinder for menuExample', this);
  7. this.$elem.find('a').click(function(e) {
  8. e.preventDefault();
  9. var $link = $(this);
  10. console.log('menu item clicked', $link.prop('href'));
  11. var originalColor = $link.css('backgroundColor');
  12. // self.toggleMenu();
  13. $link.animate({
  14. backgroundColor: '#aaa',
  15. }, 70);
  16. $link.animate({
  17. backgroundColor: originalColor,
  18. }, 70);
  19. _ws.navigator.navigateTo($link.prop('href'));
  20. });
  21. }
  22. }
  23. /**
  24. * Render an UI part
  25. */
  26. function renderPart(partName, data) {
  27. var part = _ws.ui[partName];
  28. part.$elem.html( Mustache.render( part.tmpl, data ) );
  29. }
  30. _ws.makeView = function(elemId, props) {
  31. var v = {};
  32. props = props || {};
  33. v.$elem = $('#' + elemId);
  34. v.partName = _.camelCase(elemId);
  35. _ws.ui[v.partName] = v;
  36. // Assign a default render function if none given
  37. if(! props.render) {
  38. var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
  39. v.tmpl = $tmplEl.html();
  40. v.render = (function(data) {
  41. var eventBinder = eventBinders[v.partName];
  42. this.$elem.html( Mustache.render( this.tmpl, data ) );
  43. if(eventBinder) {
  44. eventBinder = eventBinder.bind(this);
  45. console.log('bind events for', v.partName);
  46. eventBinder();
  47. }
  48. }).bind(v);
  49. }
  50. // Otherwise bind the provided one
  51. else {
  52. v.render = props.render.bind(v);
  53. }
  54. // Set event handlers
  55. if(props.events) {
  56. for(var descriptor in props.events) {
  57. var handler = props.events[descriptor];
  58. var bits = descriptor.split(' ');
  59. var evtName = bits.shift();
  60. var selector = bits.join(' ');
  61. console.log('#### bind', descriptor, 'e:' + evtName, 's:' + selector, handler.toString())
  62. v.$elem.on(evtName, handler);
  63. }
  64. }
  65. }
  66. /**
  67. * Initialize an empty object to be populated as follows:
  68. * - key is an UI element's id
  69. * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
  70. */
  71. _ws.ui = {};
  72. // Iterate over the template script elements
  73. var $templateElems = $('script[data-tmpl-for]');
  74. $templateElems.each(function(idx, el) {
  75. return;
  76. // Get the script element content and target element id
  77. var $script = $(el);
  78. var tmpl = $script.html();
  79. var elemId = $script.data('tmpl-for');
  80. var $elem = $('#' + elemId);
  81. var partName = _.camelCase(elemId);
  82. // Populate the uiParts object
  83. _ws.ui[partName] = {
  84. tmpl: tmpl,
  85. $elem: $elem,
  86. render: (function(_name) {
  87. return function(data) {
  88. var eventBinder = eventBinders[_name];
  89. renderPart(_name, data);
  90. if(eventBinder) {
  91. eventBinder = eventBinder.bind(this);
  92. console.log('bind events for', _name);
  93. eventBinder();
  94. }
  95. };
  96. })(partName)
  97. };
  98. });
  99. // console.log(_.map(_ws.uiParts, p => (p.render.toString())));
  100. });
  101. })(jQuery);