(五)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访问底层的数据库. 现在 ...
随机推荐
- 发布一款仿天猫产品放大镜JQuery插件
效果如下图: 1.原图 2.放大镜效果: 插件源码如下: /* * * JQUERY 简洁无极放大镜插件-zoomer * Author:盛世游侠 * QQ:418873053 * Date:2013 ...
- CentOS下建立本地YUM源并自动更新
1. 尽管有很多的免费镜像提供yum源服务,但是还是有必要建立自己的yum服务器,主要出于以下几点考虑: l 网络速度:访问互联网可能比较慢 l 节省带宽:如果有大量的服务器,架设自己的yum源可以有 ...
- 利用FbinstTool+大白菜u盘工具,制作多系统启动U盘【转】
一般制作多系统启动盘的教程都会要用到rub4dos+grubinst+ultraiso+msgdiyerl等等工具,一大串的工具列表让人望而生畏.其实大白菜里已经对这些工具做了非常好的封装,利用大白菜 ...
- Windows下python安装matplotlib
此文为转载,原文地址为:http://blog.csdn.net/u010585135/article/details/42127273 一.下载matplotlib安装包:网址http://matp ...
- Android UI 调试常用工具(Dump view UI hierarchy for Automator)
UI调试时程序员比较头疼的问题:有时候经常会被1dp.2dp的问题,搞得无言以对(Android开发深有体会) 下面介绍一个在实际开发过程中常用的一个调试工具,可以精确到每个View在屏幕中的绝对位置 ...
- New ipad安装Perl支持安装nikto
Title:New ipad安装Perl支持安装nikto --2012-11-15 09:47 New Ipad 越了后. ssh new ipad 进入目录 cd /tmp 下载Key文件 wge ...
- ng-options
tr td 地点 td select.form-control(required="true" ng-model="addkc.dd" ng-options=& ...
- Android UI主线程与子线程
一个Android 程序默认情况只有一个进程,但是一个进程可以有多个线程.其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被创建,主要是负责控制UI界面的显示. ...
- android弹出式菜单、弹出式对话框、弹出式窗口
http://www.open-open.com/lib/view/open1389767042601.html http://www.open-open.com/lib/view/open13321 ...
- java调优随记-堆和栈
基础知识: 关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位.栈解决的是程序的运行问题 ...