PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/main.js

https://bitbucket.org/saritafurtado/backbone
JavaScript | 214 lines | 165 code | 38 blank | 11 comment | 7 complexity | 6db71398281e33210b627f07171464c0 MD5 | raw file
  1. // Models
  2. window.Wine = Backbone.Model.extend({
  3. urlRoot:"https://apid.numadic.com/3pl/trips?page=0&limit=25&q=&status=inprogress&email=sedrick@numadic.com",
  4. defaults:{
  5. "id":null,
  6. "name":"",
  7. "grapes":"",
  8. "country":"USA",
  9. "region":"California",
  10. "year":"",
  11. "description":"",
  12. "picture":"",
  13. "count":0
  14. }
  15. });
  16. window.WineCollection = Backbone.Collection.extend({
  17. model:Wine,
  18. url:"https://apid.numadic.com/3pl/trips?page=0&limit=25&q=&status=inprogress&email=sarita@numadic.com",
  19. parse: function(data) {
  20. return data.data;
  21. }
  22. });
  23. // Views
  24. window.WineListView = Backbone.View.extend({
  25. tagName:'ul',
  26. initialize:function () {
  27. this.model.bind("reset", this.render, this);
  28. var self = this;
  29. this.model.bind("add", function (wine) {
  30. $(self.el).append(new WineListItemView({model:wine}).render().el);
  31. });
  32. },
  33. render:function (eventName) {
  34. console.log(this.model.models)
  35. _.each(this.model.models, function (wine) {
  36. $(this.el).append(new WineListItemView({model:wine}).render().el);
  37. }, this);
  38. return this;
  39. }
  40. });
  41. window.WineListItemView = Backbone.View.extend({
  42. tagName:"li",
  43. template:_.template($('#tpl-wine-list-item').html()),
  44. initialize:function () {
  45. this.model.bind("change", this.render, this);
  46. this.model.bind("destroy", this.close, this);
  47. },
  48. render:function (eventName) {
  49. //var data = this.model.toJSON().data
  50. var data = this.model.toJSON()
  51. //_.each(data, function (trip) {
  52. //$(this.el).html(this.template(trip));
  53. $(this.el).html(this.template(data));
  54. //}, this);
  55. return this;
  56. },
  57. close:function () {
  58. $(this.el).unbind();
  59. $(this.el).remove();
  60. }
  61. });
  62. window.WineView = Backbone.View.extend({
  63. template:_.template($('#tpl-wine-details').html()),
  64. initialize:function () {
  65. this.model.bind("change", this.render, this);
  66. },
  67. render:function (eventName) {
  68. $(this.el).html(this.template(this.model.toJSON()));
  69. return this;
  70. },
  71. events:{
  72. "change input":"change",
  73. "click .save":"saveWine",
  74. "click .delete":"deleteWine"
  75. },
  76. change:function (event) {
  77. var target = event.target;
  78. console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value);
  79. // You could change your model on the spot, like this:
  80. // var change = {};
  81. // change[target.name] = target.value;
  82. // this.model.set(change);
  83. },
  84. saveWine:function () {
  85. this.model.set({
  86. name:$('#name').val(),
  87. grapes:$('#grapes').val(),
  88. country:$('#country').val(),
  89. region:$('#region').val(),
  90. year:$('#year').val(),
  91. description:$('#description').val()
  92. });
  93. if (this.model.isNew()) {
  94. var self = this;
  95. app.wineList.create(this.model, {
  96. success:function () {
  97. app.navigate('wines/' + self.model.id, false);
  98. }
  99. });
  100. } else {
  101. this.model.save();
  102. }
  103. return false;
  104. },
  105. deleteWine:function () {
  106. this.model.destroy({
  107. success:function () {
  108. alert('Wine deleted successfully');
  109. window.history.back();
  110. }
  111. });
  112. return false;
  113. },
  114. close:function () {
  115. $(this.el).unbind();
  116. $(this.el).empty();
  117. }
  118. });
  119. window.HeaderView = Backbone.View.extend({
  120. template:_.template($('#tpl-header').html()),
  121. initialize:function () {
  122. this.render();
  123. },
  124. render:function (eventName) {
  125. $(this.el).html(this.template());
  126. return this;
  127. },
  128. events:{
  129. "click .new":"newWine"
  130. },
  131. newWine:function (event) {
  132. app.navigate("wines/new", true);
  133. return false;
  134. }
  135. });
  136. // Router
  137. var AppRouter = Backbone.Router.extend({
  138. routes:{
  139. "":"list",
  140. "wines/new":"newWine",
  141. "wines/:id":"wineDetails"
  142. },
  143. initialize:function () {
  144. $('#header').html(new HeaderView().render().el);
  145. },
  146. list:function () {
  147. this.wineList = new WineCollection();
  148. var self = this;
  149. console.log(this.wineList)
  150. this.wineList.fetch({
  151. success:function () {
  152. self.wineListView = new WineListView({model:self.wineList});
  153. $('#sidebar').html(self.wineListView.render().el);
  154. if (self.requestedId) self.wineDetails(self.requestedId);
  155. }
  156. });
  157. },
  158. wineDetails:function (id) {
  159. if (this.wineList) {
  160. this.wine = this.wineList.get(id);
  161. if (this.wineView) this.wineView.close();
  162. this.wineView = new WineView({model:this.wine});
  163. $('#content').html(this.wineView.render().el);
  164. } else {
  165. this.requestedId = id;
  166. this.list();
  167. }
  168. },
  169. newWine:function () {
  170. if (app.wineView) app.wineView.close();
  171. app.wineView = new WineView({model:new Wine()});
  172. $('#content').html(app.wineView.render().el);
  173. }
  174. });
  175. var app = new AppRouter();
  176. Backbone.history.start();