ws-ui-parts.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. if(! props.render) {
  37. var $tmplEl = $('script[data-tmpl-for="' + elemId + '"]');
  38. v.tmpl = $tmplEl.html();
  39. v.render = (function(data) {
  40. var eventBinder = eventBinders[v.partName];
  41. this.$elem.html( Mustache.render( this.tmpl, data ) );
  42. if(eventBinder) {
  43. eventBinder = eventBinder.bind(this);
  44. console.log('bind events for', v.partName);
  45. eventBinder();
  46. }
  47. }).bind(v);
  48. }
  49. }
  50. /**
  51. * Initialize an empty object to be populated as follows:
  52. * - key is an UI element's id
  53. * - value associated is an obj containing: tmpl (the template) and $elem (jQueried target element)
  54. */
  55. _ws.ui = {};
  56. // Iterate over the template script elements
  57. var $templateElems = $('script[data-tmpl-for]');
  58. $templateElems.each(function(idx, el) {
  59. return;
  60. // Get the script element content and target element id
  61. var $script = $(el);
  62. var tmpl = $script.html();
  63. var elemId = $script.data('tmpl-for');
  64. var $elem = $('#' + elemId);
  65. var partName = _.camelCase(elemId);
  66. // Populate the uiParts object
  67. _ws.ui[partName] = {
  68. tmpl: tmpl,
  69. $elem: $elem,
  70. render: (function(_name) {
  71. return function(data) {
  72. var eventBinder = eventBinders[_name];
  73. renderPart(_name, data);
  74. if(eventBinder) {
  75. eventBinder = eventBinder.bind(this);
  76. console.log('bind events for', _name);
  77. eventBinder();
  78. }
  79. };
  80. })(partName)
  81. };
  82. });
  83. // console.log(_.map(_ws.uiParts, p => (p.render.toString())));
  84. });
  85. })(jQuery);