(五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是
DEMO通信录的扩展,使用requirejs模块化整合
大体实现
• model文件 model/contact.js
1 define(function (){ 2 // user contact 3 var Contact = (function(){ 4 var _c = Backbone.Model.extend({ 5 defaults: { 6 name: ‘小强‘, 7 email: ‘小强@无敌.com‘ 8 }, 9 // validate user name 10 validate: function(attrs,options) { 11 if (attrs.name == "") { 12 return "what‘s the name?"; 13 }; 14 }, 15 // for user search 16 filter: function(query) { 17 if (typeof(query) === ‘undefined‘ || query === null || query === ‘‘) return true; 18 query = query.toLowerCase(); 19 return this.get(‘name‘).toLowerCase().indexOf(query) != -1 || this.get(‘email‘).toLowerCase().indexOf(query) != -1; 20 } 21 }); 22 return _c; 23 })(); 24 25 var _store = (function(){ 26 return new Store("my-contacts"); 27 })(); 28 var Contacts = (function(){ 29 var _c = Backbone.Collection.extend({ 30 model: Contact, 31 localStorage: _store 32 }); 33 return _c; 34 })(); 35 36 return { 37 Contact:Contact, 38 Contacts:Contacts 39 }; 40 41 });
• view文件 view/view.js
1 define(["model/contact"], function (_contact){ 2 3 // one user contact view 4 var ContactItemView = Backbone.View.extend({ 5 className: ‘item‘, 6 template: _.template($(‘#tpl-item‘).html()), 7 events: { 8 ‘click‘: ‘select‘ 9 }, 10 initialize: function() { 11 _.bindAll(this, ‘select‘); // select方法绑定到当前对象 12 this.model.bind(‘reset‘, this.render, this); 13 this.model.bind(‘change‘, this.render, this); 14 this.model.bind(‘destroy‘, this.remove, this); 15 if(this.model.view){ 16 this.model.view.remove(); 17 } 18 this.model.view = this; 19 }, 20 render: function() { 21 this.$el.html(this.template(this.model.toJSON())); 22 return this; 23 }, 24 select: function() { // 选择某个联系人 25 appRouter.navigate(‘contacts/‘ + this.model.cid, { 26 trigger: true 27 }); 28 }, 29 active: function() { 30 this.$el.addClass(‘active‘); 31 }, 32 deactive: function() { 33 this.$el.removeClass(‘active‘); 34 } 35 }); 36 37 // user contact list view 38 var ContactListView = Backbone.View.extend({ 39 className: ‘sidebar‘, 40 template: _.template($(‘#tpl-sidebar‘).html()), 41 events: { 42 ‘click footer button‘: ‘create‘, // footer 标签内的 button 标签 click 事件 43 ‘click input‘: ‘filter‘, 44 ‘keyup input‘: ‘filter‘ 45 }, 46 initialize: function() { 47 _.bindAll(this, ‘create‘, ‘filter‘); // 给 create,filter 函数绑定到当前对象 48 // model 监听事件 49 this.model.bind(‘reset‘, this.renderAll, this); 50 this.model.bind(‘add‘, this.add, this); 51 this.model.bind(‘remove‘, this.remove, this); 52 }, 53 render: function() { 54 $(this.el).html(this.template()); 55 this.renderAll(); 56 return this; 57 }, 58 renderAll: function() { 59 this.$(".items").empty(); 60 this.model.each(this.renderOne, this); 61 this.filter(); 62 }, 63 renderOne: function(contact) { 64 var view = new ContactItemView({ 65 model: contact 66 }); 67 this.$(".items").append(view.render().el); 68 }, 69 create: function() { 70 var contact = new _contact.Contact(); 71 this.model.add(contact); 72 appRouter.navigate(‘contacts/‘ + contact.cid + ‘/edit‘, { 73 trigger:true 74 }); 75 }, 76 filter: function() { 77 var query = $(‘input‘, this.el).val(); 78 this.model.each(function(contact, element, index, list) { 79 contact.view.$el.toggle(contact.filter(query)); 80 }); 81 }, 82 active: function(item){ 83 if (this.activeItem) { 84 this.activeItem.view.deactive(); 85 } 86 this.activeItem = item; 87 if (this.activeItem) { 88 this.activeItem.view.active(); 89 } 90 }, 91 add: function(contact) { 92 this.renderOne(contact); 93 }, 94 remove: function(contact) { 95 console.log(contact); 96 } 97 }); 98 99 // show one user View 100 var ShowView = Backbone.View.extend({ 101 className: ‘show‘, 102 template: _.template($(‘#tpl-show‘).html()), 103 events: { 104 ‘click .edit‘: ‘edit‘ 105 }, 106 initialize: function() { 107 _.bindAll(this, ‘edit‘); 108 }, 109 render: function() { 110 if(this.item){ 111 this.$el.html(this.template(this.item.toJSON())); 112 } 113 return this; 114 }, 115 change: function(item) { 116 this.item = item; 117 this.render(); 118 }, 119 edit: function() { 120 if (this.item) appRouter.navigate(‘contacts/‘ + this.item.cid + ‘/edit‘, { 121 trigger: true 122 }); 123 } 124 }); 125 126 // edit usr contact view 127 var EditView = Backbone.View.extend({ 128 className: ‘edit‘, 129 template: _.template($(‘#tpl-edit‘).html()), 130 events: { 131 ‘submit form‘: ‘submit‘, 132 ‘click .save‘: ‘submit‘, 133 ‘click .delete‘: ‘remove‘ 134 }, 135 initialize: function() { 136 _.bindAll(this, ‘submit‘, ‘remove‘); 137 }, 138 render: function() { 139 if(this.item){ 140 this.$el.html(this.template(this.item.toJSON())); 141 } 142 return this; 143 }, 144 change: function(item) { 145 this.item = item; 146 this.render(); 147 }, 148 submit: function() { 149 this.item.set(this.form()); 150 this.item.save(); 151 appRouter.navigate(‘contacts/‘ + this.item.cid, { 152 trigger:true 153 }); 154 return false; 155 }, 156 form: function() { 157 return { 158 name: this.$(‘form [name="name"]‘).val(), 159 email: this.$(‘form [name="email"]‘).val() 160 }; 161 }, 162 remove: function() { 163 this.item.destroy(); 164 this.item = null; 165 appRouter.navigate(‘‘, { 166 trigger: true 167 }); 168 } 169 }); 170 171 // main view 172 // show and edit users 173 var MainView = Backbone.View.extend({ 174 className: ‘main stack‘, 175 initialize: function() { 176 this.editView = new EditView(); 177 this.showView = new ShowView(); 178 }, 179 render: function() { 180 this.$el.append(this.showView.render().el); 181 this.$el.append(this.editView.render().el); 182 return this; 183 }, 184 edit: function(item) { 185 this.showView.$el.removeClass(‘active‘); 186 this.editView.$el.addClass(‘active‘); 187 this.editView.change(item); 188 }, 189 show: function(item) { 190 this.editView.$el.removeClass(‘active‘); 191 this.showView.$el.addClass(‘active‘); 192 this.showView.change(item); 193 } 194 }); 195 196 // app view 197 // all page view, for contact list and main view 198 var AppView = Backbone.View.extend({ 199 className: ‘contacts‘, 200 initialize: function() { 201 this.contactList = new ContactListView({ 202 model: this.model 203 }); 204 this.main = new MainView(); 205 this.vdiv = $(‘<div />‘).addClass(‘vdivide‘); 206 this.model.fetch(); 207 this.render(); 208 }, 209 render: function() { 210 this.$el.append(this.contactList.render().el); 211 this.$el.append(this.vdiv); 212 this.$el.append(this.main.render().el); 213 $(‘#article‘).append(this.el); 214 return this; 215 }, 216 show: function(item){ 217 this.contactList.active(item); 218 this.main.show(item); 219 }, 220 edit: function(item){ 221 this.contactList.active(item); 222 this.main.edit(item); 223 } 224 }); 225 226 return { 227 AppView:AppView, 228 MainView:MainView 229 }; 230 });
• router文件 router/router.js
1 define(["view/view","model/contact"], function (_view,_content){ 2 var dolymood = {}; 3 dolymood.contacts = new _content.Contacts(); 4 dolymood.appView = new _view.AppView({ 5 model:dolymood.contacts 6 }); 7 dolymood.AppRouter = Backbone.Router.extend({ 8 routes: { 9 ‘‘: ‘show‘, 10 ‘contacts/:id‘: ‘show‘, 11 ‘contacts/:id/edit‘: ‘edit‘ 12 }, 13 show: function(id) { 14 if(id !== undefined){ 15 dolymood.appView.show(this.getContact(id)); 16 } 17 else { 18 dolymood.appView.show(dolymood.contacts.first()); 19 } 20 }, 21 edit: function(id) { 22 if(id !== undefined){ 23 dolymood.appView.edit(this.getContact(id)); 24 } 25 }, 26 getContact: function(id) { 27 return dolymood.contacts.get(id); 28 } 29 }); 30 31 return dolymood; 32 33 });
• main文件
使用main文件对应用进行启动
require(["router/router"], function (dolymood){ // app start window.appRouter = new dolymood.AppRouter(); Backbone.history.start(); });
• requirejs 的 引用
<script src="js/lib/requirejs.js" type="text/javascript" charset="utf-8" data-main="js/main.js"></script>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。