(五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是
DEMO通信录的扩展,使用requirejs模块化整合
大体实现
• model文件 model/contact.js
 define(function (){
 // user contact
 var Contact = (function(){
     var _c = Backbone.Model.extend({
         defaults: {
             name: '小强',
             email: '小强@无敌.com'
         },
         // validate user name
         validate: function(attrs,options) {
             if (attrs.name == "") {
               return "what's the name?";
             };
         },
         // for user search
         filter: function(query) {
             if (typeof(query) === 'undefined' || query === null || query === '') return true;
             query = query.toLowerCase();
             return this.get('name').toLowerCase().indexOf(query) != -1 || this.get('email').toLowerCase().indexOf(query) != -1;
         }
     });
     return _c;
 })();
 var _store = (function(){
     return new Store("my-contacts");
 })();
 var Contacts = (function(){
     var _c = Backbone.Collection.extend({
         model: Contact,
         localStorage: _store
     });
     return _c;
 })();
 return {
     Contact:Contact,
     Contacts:Contacts
 };
 });
• view文件 view/view.js
 define(["model/contact"], function (_contact){
 // one user contact view
 var ContactItemView = Backbone.View.extend({
     className: 'item',
     template: _.template($('#tpl-item').html()),
     events: {
         'click': 'select'
     },
     initialize: function() {
         _.bindAll(this, 'select');    // select方法绑定到当前对象
         this.model.bind('reset', this.render, this);
         this.model.bind('change', this.render, this);
         this.model.bind('destroy', this.remove, this);
         if(this.model.view){
             this.model.view.remove();
         }
         this.model.view = this;
     },
     render: function() {
         this.$el.html(this.template(this.model.toJSON()));
         return this;
     },
     select: function() {    // 选择某个联系人
         appRouter.navigate('contacts/' + this.model.cid, {
             trigger: true
         });
     },
     active: function() {
         this.$el.addClass('active');
     },
     deactive: function() {
         this.$el.removeClass('active');
     }
 });
 // user contact list view
 var ContactListView = Backbone.View.extend({
     className: 'sidebar',
     template: _.template($('#tpl-sidebar').html()),
     events: {
         'click footer button': 'create',    // footer 标签内的 button 标签 click 事件
         'click input': 'filter',
         'keyup input': 'filter'
     },
     initialize: function() {
         _.bindAll(this, 'create', 'filter');    // 给 create,filter 函数绑定到当前对象
         // model 监听事件
         this.model.bind('reset', this.renderAll, this);
         this.model.bind('add', this.add, this);
         this.model.bind('remove', this.remove, this);
     },
     render: function() {
         $(this.el).html(this.template());
         this.renderAll();
         return this;
     },
     renderAll: function() {
         this.$(".items").empty();
         this.model.each(this.renderOne, this);
         this.filter();
     },
     renderOne: function(contact) {
         var view = new ContactItemView({
             model: contact
         });
         this.$(".items").append(view.render().el);
     },
     create: function() {
         var contact = new _contact.Contact();
         this.model.add(contact);
         appRouter.navigate('contacts/' + contact.cid + '/edit', {
             trigger:true
         });
     },
     filter: function() {
         var query = $('input', this.el).val();
         this.model.each(function(contact, element, index, list) {
             contact.view.$el.toggle(contact.filter(query));
         });
     },
     active: function(item){
         if (this.activeItem) {
             this.activeItem.view.deactive();
         }
         this.activeItem = item;
         if (this.activeItem) {
             this.activeItem.view.active();
         }
     },
     add: function(contact) {
         this.renderOne(contact);
     },
     remove: function(contact) {
         console.log(contact);
     }
 });
 // show one user View
 var ShowView = Backbone.View.extend({
     className: 'show',
     template: _.template($('#tpl-show').html()),
     events: {
         'click .edit': 'edit'
     },
     initialize: function() {
         _.bindAll(this, 'edit');
     },
     render: function() {
         if(this.item){
             this.$el.html(this.template(this.item.toJSON()));
         }
         return this;
     },
     change: function(item) {
         this.item = item;
         this.render();
     },
     edit: function() {
         if (this.item) appRouter.navigate('contacts/' + this.item.cid + '/edit', {
           trigger: true
         });
     }
 });
 // edit usr contact view
 var EditView = Backbone.View.extend({
     className: 'edit',
     template: _.template($('#tpl-edit').html()),
     events: {
         'submit form': 'submit',
         'click .save': 'submit',
         'click .delete': 'remove'
     },
     initialize: function() {
         _.bindAll(this, 'submit', 'remove');
     },
     render: function() {
         if(this.item){
             this.$el.html(this.template(this.item.toJSON()));
         }
         return this;
     },
     change: function(item) {
         this.item = item;
         this.render();
     },
     submit: function() {
         this.item.set(this.form());
         this.item.save();
         appRouter.navigate('contacts/' + this.item.cid, {
             trigger:true
         });
         return false;
     },
     form: function() {
         return {
             name: this.$('form [name="name"]').val(),
             email: this.$('form [name="email"]').val()
         };
     },
     remove: function() {
         this.item.destroy();
         this.item = null;
         appRouter.navigate('', {
           trigger: true
         });
     }
 });
 // main view
 // show and edit users
 var MainView = Backbone.View.extend({
     className: 'main stack',
     initialize: function() {
         this.editView = new EditView();
         this.showView = new ShowView();
     },
     render: function() {
         this.$el.append(this.showView.render().el);
         this.$el.append(this.editView.render().el);
         return this;
     },
     edit: function(item) {
         this.showView.$el.removeClass('active');
         this.editView.$el.addClass('active');
         this.editView.change(item);
     },
     show: function(item) {
         this.editView.$el.removeClass('active');
         this.showView.$el.addClass('active');
         this.showView.change(item);
     }
 });
 // app view
 // all page view, for contact list and main view
 var AppView = Backbone.View.extend({
     className: 'contacts',
     initialize: function() {
         this.contactList = new ContactListView({
             model: this.model
         });
         this.main = new MainView();
         this.vdiv = $('<div />').addClass('vdivide');
         this.model.fetch();
         this.render();
     },
     render: function() {
         this.$el.append(this.contactList.render().el);
         this.$el.append(this.vdiv);
         this.$el.append(this.main.render().el);
         $('#article').append(this.el);
         return this;
     },
     show: function(item){
         this.contactList.active(item);
         this.main.show(item);
     },
     edit: function(item){
         this.contactList.active(item);
         this.main.edit(item);
     }
 });
 return {
     AppView:AppView,
     MainView:MainView
 };
 });
• router文件 router/router.js
 define(["view/view","model/contact"], function (_view,_content){
 var dolymood = {};
 dolymood.contacts = new _content.Contacts();
 dolymood.appView = new _view.AppView({
     model:dolymood.contacts
 });
 dolymood.AppRouter = Backbone.Router.extend({
     routes: {
         '': 'show',
         'contacts/:id': 'show',
         'contacts/:id/edit': 'edit'
     },
     show: function(id) {
         if(id !== undefined){
             dolymood.appView.show(this.getContact(id));
         }
         else {
             dolymood.appView.show(dolymood.contacts.first());
         }
     },
     edit: function(id) {
         if(id !== undefined){
             dolymood.appView.edit(this.getContact(id));
         }
     },
     getContact: function(id) {
         return dolymood.contacts.get(id);
     }
 });
 return dolymood;
 });
• 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>
(五)backbone - DEMO - 通信录改造之使用requirejs的更多相关文章
- (四)backbone - DEMO - 通信录
		
DEMO介绍 是DEMO - User List 的扩展,增加查询 大体实现 •创建Contact Model var Contact = Backbone.Model.extend({ defaul ...
 - node.js入门学习(五)--Demo模块化改造
		
1.node.js中模块的分类 1)node.js内置模块(核心,原生) 所有内置模块在安装node.js时就已经编译成二进制文件,可以直接加载运行(速度较快),部分内置模块,在node.exe这个进 ...
 - 今天研究了一下手机通信录管理系统(C语言)
		
题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...
 - MVVM与Backbone demo
		
MVVM https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
 - 非智能手机通信录备份并还原至Android智能手机方法
		
随着智能手机早已深入普通用户的生活,2-3线城市的用户也逐渐从使用非智能机换成使用智能机.最近便遇见了这样一个转移通讯录的需求.之前使用的手机型号是BBK K201,通信录中绝大部分保存在了手机中,最 ...
 - 管理Android通信录
		
Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据 ...
 - 通信录列表+复杂Adapter分析
		
概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些 ...
 - iOS:通信录(完成)(18-01-18更)
		
1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...
 - 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
		
Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...
 
随机推荐
- 使用telnet操作memcache,一般不常用
			
使用telnet操作memcache,一般不常用 1.使用方法 1. 连接到memcached telnet 192.168.1.100 11211 add name 0 60 5 [说明 ...
 - php设计模式2策略模式
			
<?php /** ****************************************************** * 策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接 ...
 - DEVICE_OBJECT结构参数
			
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size ...
 - lucene分词多种方法
			
目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要.另外网友谈的比较多的中文分词器还有:CJKAnalyzerChinese ...
 - HEX和BIN文件的区别
			
以下的内容是从网上转载来的,原文地址:http://blog.csdn.net/zhangliang_571/article/details/8519469 在这里感谢原作者. 1,是在keil中编 ...
 - 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一
			
转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...
 - C#数据类型汇总
			
通用类型系统 C#中,变量是值还是引用仅取决于数据类型 所有的数据类型都是对象.因为它们具有自己ide方法和属性 int int_value = 101; //调用*int_value*的比较方法与整 ...
 - Altium Designer  等长线&&蛇形线
			
Altium Designer 里面怎么画等长线 (1)一般是将走线布完后,新建一个class. Design -> Classes 如上图添加完后可以点击close. (2)快捷键 T + R ...
 - Ubuntu下Qt-4.7.1的静态编译
			
最近在学习Qt的静态编译,相比较来说windows的Qt静态编译比较容易,相反对于linux编译网上的文章实践下来都有这样那样的错误,这里简要小结一下自己的编译成果. 一.实验环境 1.Ubuntu ...
 - VS快捷键大全(转)
			
相信.Net开发人员都想能够熟记各种VS快捷键以提高平时开发的效率,但苦于记忆能力太差而快捷键又特别多,特别烦,所以作罢! 下面我将简单介绍一下我记忆VS快捷键的一些方法,希望对大家有所帮助. 1.窗 ...