PageRenderTime 38ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/assets/js/main.js

https://gitlab.com/x33n/Backbone-Music-Store
JavaScript | 118 lines | 107 code | 11 blank | 0 comment | 3 complexity | ecd42f9cea10ef0f2c672a1a3f539801 MD5 | raw file
  1. var Helpers = {
  2. showMessage: function ( header, message, type ) {
  3. var _html = "<h4>" + header + "</h4>";
  4. _html += "<p>" + message + "</p>";
  5. $('#alert')
  6. .removeClass()
  7. .removeAttr('style')
  8. .addClass('alert alert-block alert-' + type)
  9. .html(_html)
  10. .animate({ opacity: 1.0 }, 5000)
  11. .fadeOut('slow');
  12. }
  13. };
  14. Backbone.emulateHTTP = true;
  15. Backbone.emulateJSON = true;
  16. window.Genre = Backbone.Model.extend({
  17. defaults: {
  18. id: null,
  19. name: ''
  20. },
  21. validate: function ( attribs ) {
  22. if (attribs.name === undefined || attribs.name === '') {
  23. return 'Remember to set a name for your genre.';
  24. }
  25. }
  26. });
  27. window.Genres = Backbone.Collection.extend({
  28. model: Genre
  29. });
  30. window.GenreListView = Backbone.View.extend({
  31. el: $('#genre-menu'),
  32. initialize: function () {
  33. this.render();
  34. },
  35. render: function ( e ) {
  36. _.each(this.model.models, function ( genre ) {
  37. $(this.el).append(new GenreListItemView({ model: genre }).render());
  38. }, this);
  39. return this.el;
  40. }
  41. });
  42. window.GenreListItemView = Backbone.View.extend({
  43. template: _.template($('#genre-item-template').html()),
  44. initialize: function () {
  45. var self = this;
  46. this.model.bind('change', self.render, this);
  47. this.model.bind('destroy', self.close, this);
  48. },
  49. render: function ( e ) {
  50. $(this.el).html(this.template(this.model.toJSON()));
  51. return this.el;
  52. },
  53. close: function () {
  54. $(this.el).unbind().remove();
  55. }
  56. });
  57. window.GenreView = Backbone.View.extend({
  58. el: $('#content'),
  59. template: _.template($('#genre-template').html()),
  60. initialize: function () {
  61. var self = this;
  62. this.model.on('error', function ( model, error ) {
  63. Helpers.showMessage('Genre', error, 'error');
  64. });
  65. this.model.bind('change', self.render, this);
  66. this.model.bind('destroy', self.close, this);
  67. this.render();
  68. },
  69. render: function ( e ) {
  70. $(this.el).html(this.template(this.model.toJSON()));
  71. return this.el;
  72. },
  73. events: {
  74. 'click a.btn-primary': 'saveChanges'
  75. },
  76. saveChanges: function () {
  77. this.model.set({
  78. 'id': $('#id').val(),
  79. 'name': $('#name').val()
  80. });
  81. },
  82. close: function () {
  83. $(this.el).unbind().empty();
  84. }
  85. });
  86. var AppRouter = Backbone.Router.extend({
  87. routes: {
  88. 'genres/:id': 'browse'
  89. },
  90. browse: function ( id ) {
  91. var genre = genreList.get(id);
  92. console.log( 'Browsing ' + genre.get('name'));
  93. var genreView = new GenreView({ model: genre });
  94. }
  95. });
  96. var genreList = new Genres();
  97. genreList.add(new Genre({ id: 1, name: 'Blues' }));
  98. genreList.add(new Genre({ id: 2, name: 'Classical' }));
  99. genreList.add(new Genre({ id: 3, name: 'Electronic' }));
  100. genreList.add(new Genre({ id: 4, name: 'Jazz' }));
  101. genreList.add(new Genre({ id: 5, name: 'Pop' }));
  102. genreList.add(new Genre({ id: 6, name: 'R&B' }));
  103. genreList.add(new Genre({ id: 7, name: 'Reggae' }));
  104. genreList.add(new Genre({ id: 8, name: 'Rock' }));
  105. this.genreMenu = new GenreListView({ model: genreList });
  106. var app = new AppRouter();
  107. Backbone.history.start();