(二)backbone - DEMO - user list
Demo介绍
学习了如何基本的使用Backbone,展示用户信息
使用JQuery操作DOM,backbone.localStorage.js操作localstorage
大体实现
•创建user Model
var User = Backbone.Model.extend({
defaults: {
username: '小强'
},
initialize: function() {
if (!this.get("username")) {
this.set({"username": this.defaults.username});
}
if (!this.get("userid")) {
this.set({"userid": ++userid});
}
}
});
•创建user Collection管理users
var UserCollection = Backbone.Collection.extend({
model: User,
// 持久化到本地数据库
localStorage: new Store("users")
});
•创建View
按功能页划分:
- 列表页
- 添加(修改)页
- 详情页
创建基础View
var View = Backbone.View.extend({
register:function (state) {
this.state = state;
return this;
}
});
创建User Item 视图
var UserItemView = View.extend({
tagName: 'li', // 放view展示内容的外层容器,默认div
template: _.template($('#user-item-template').html()),
render: function () { // 渲染
this.$el.html(this.template(this.model.toJSON()));
return this;
},
events:{ // 事件列表
'click .removeUser': 'deleteUser',
'click .viewUser': 'viewUser'
},
viewUser: function() {
this.state.trigger('viewUser', this.model);
},
deleteUser: function() {
this.state.trigger('removeUser', this.model);
this.remove();
}
});
创建User list 视图,该视图可创建user item view
var userListView = View.extend({
template: _.template($('#list-template').html()),
initialize: function() {
var view = this;
this.state = new Backbone.Model(); // 实例化一个model
this.router = this.options.router;
// 调用fetch触发reset
this.collection.unbind('reset');
this.collection.bind('reset', this.addAll, this);
setTimeout(function(){
view.collection.fetch();
},0);
},
render: function() {
var view = this;
this.$el.html(this.template(this.state.toJSON()));
// 服务器同步
this.state.on('removeUser', function(user) {
user.destory();
view.collection.remove(user);
});
this.state.on('viewUser', function(user) {
view.router.navigate('user/' + user.cid, {trigger:true});
}); return this;
},
createUserItemView: function(user) {
var userItemView = new UserItemView({
model: user
});
userid = Math.max.call(null, user.get('userid'),userid);
userItemView.register(this.state).render().$el.appendTo($('#list'));
},
addAll: function() {
this.collection.each(this.createUserItemView.bind(this));
}
});
User Modify 视图
var UserModifyView = View.extend({
template: _.template($('#modify-template').html()),
initialize: function() {
this.router = this.options.router;
},
render: function() {
var view = this;
if(this.model) {
this.$el.html(this.template(this.model.toJSON()));
}
else {
this.$el.html(this.template({username: ''}));
}
setTimeout(function() {
view.$el.find('input').focus().select(); //设置焦点并选中
}, 0);
return this;
},
events: {
'click a.add': 'modify'
},
modify: function(){
var view = this;
if(this.model){
this.model.save({'username': this.$el.find('input').val()});
}
else {
this.router.userCollection.create(new User({
username:view.$el.find('input').val(),
userid: ++userid
}));
}
this.router.navigate('list', {trigger:true}); // 跳转至list
}
});
User Detail 视图
var UserView = View.extend({
template: _.template($('#user-template').html()),
initialize: function(){
this.router = this.options.router;
},
render: function(){
var view = this;
this.$el.html(this.template(this.model.toJSON()));
return this;
},
events: {
'click .editUser': 'editUser'
},
editUser: function() {
this.router.navigate('edit/' + this.model.cid, {trigger:true});
this.remove();
}
});
注:以上使用的backbone版本是0.9.2,该版本Backbone.View中可导出options属性,但1.1.2 版本已不再提供该属性
因此,View的定义、实例化可改为:
var UserListView = View.extend({
...
initialize: function() {
var view = this;
this.state = new Backbone.Model();
this.router = this.attributes.router; // 使用attributes属性获取
...
}
...
}) this.currentView = new UserListView({
collection: router.userCollection,
attributes:{router:router} // 使用attributes属性传递
}).render().$el.appendTo($(this.el));
•Router 控制器
使用控制器将定义的类进行组合
var App = Backbone.Router.extend({
initialize: function(el) {
this.el = el;
this.userCollection = new UserCollection();
},
routes: {
'': 'list',
'list': 'list',
'add': 'edit',
'edit/:cid': 'edit',
'user': 'user',
'user:/:cid': 'user'
},
list: function() {
var router = this;
this.clean();
this.currentView = new UserListView({
collection: router.userCollection,
router:router
}).render().$el.appendTo($(this.el));
},
edit: function(cid) {
var router = this,
user = null;
this.clean();
if(cid){
user = router.userCollection.getByCid(cid);
}
this.currentView = new UserModifyView({
model:user,
router:router
}).render().$el.appendTo($(this.el));
},
user: function() {
var router = this,
user = null;
this.clean();
if(cid){
user = router.userCollection.getByCid(cid);
}
this.currentView = new UserView({
model:user,
router:router
}).render().$el.appendTo($(this.el));
},
clean:function () {
if (this.currentView) {
this.currentView.remove();
this.currentView = null;
}
}
});
•实例化App
new App('body');
Backbone.history.start();
•html
<!DOCTYPE html>
<html>
<head>
<title>用户列表以及详细信息</title>
<meta charset="UTF-8"/>
<link rel="stylesheet" type="text/css" href="css/app.css">
<!-- 公共库 -->
<script type="text/javascript" src="js/lib/jquery.js"></script>
<script type="text/javascript" src="js/lib/underscore.js"></script>
<script type="text/javascript" src="js/lib/backbone.js"></script>
<!-- 本地存储库 -->
<script type="text/javascript" src="js/lib/backbone.localStorage.js"></script>
<!--应用库-->
<script type="text/javascript" src="js/app.js"></script>
</head>
<body>
<script type="text/template" id="list-template">
<a href="#add">增加新用户</a>
<ul id="list"> </ul>
</script>
<script type="text/template" id="user-item-template">
<a class="viewUser" href="javascript:;"><%= username %></a>
<a class="removeUser" href="javascript:;">删除</a>
</script>
<script type="text/template" id="user-template">
<p>编号<%= userid %>:</p>
<a href="javascript:;" class="editUser">名字:<%= username %></a>
</script>
<script type="text/template" id="modify-template">
<input type="text" value="<%= username %>">
<a class="add" href="javascript:;"><%= !username ? "增加":"修改" %></a>
</script>
</body>
</html>
(二)backbone - DEMO - user list的更多相关文章
- MVVM与Backbone demo
MVVM https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
- 分享一个非常屌的eazyui二开demo
eazyui二开Demo非常吊,里面各种非常吊的样例,最喜欢的是 多文件进度条上传,一次可多选,还有流程,还有文本编辑器 非常简洁的 不像一些官网各种复杂的东西.主要为自己保留一份, 在线demo在 ...
- (五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...
- (四)backbone - DEMO - 通信录
DEMO介绍 是DEMO - User List 的扩展,增加查询 大体实现 •创建Contact Model var Contact = Backbone.Model.extend({ defaul ...
- RobotFrameWork接口报文测试-----(二)demo的升级版
在上一篇,简单的demo实现了讲xml的数据发送服务器端并取得recvi_buf,然后进行了简单的解析的操作.现在就要解决之前提过的2个问题: 1. 步骤这么多,难道每写一个脚本都要重复一次么? 2. ...
- Ace(二)Demo示例
Client: #include "ace/Log_Msg.h" #include "ace/OS.h" #include "ace/Service_ ...
- Vue入门(二)——Demo
1.在工程目录下创建项目 右键GIT BASH 2.安装lib(建议使用淘宝镜像安装) 3.首页 App.vue <template> <el-container> <e ...
- RocketMQ初探(二)之RocketMQ3.26版本搭建(含简单Demo测试案例)
作为一名程序猿,要敢于直面各种现实,脾气要好,心态要棒,纵使Bug虐我千百遍,我待它如初恋,方法也有千万种,一条路不行,换条路走走,方向对了,只要前行,总会上了罗马的道. Apache4.x最新版本既 ...
- 无废话WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
随机推荐
- shell中命令的执行流程
在shell中,一个命令有3中写法: 1 可以直接写(Normal Command) 2 可以放在双引号中("Command") 3 可以放在单引号中('Comand') 这3中写 ...
- powerdesigner设置mysql唯一键,非主键
员工表如下,先将id设置主键: 现在将"员工id"设置唯一约束: 1,切换到"Keys",发现已经存在一个Key1,这个是刚刚新增主键id.在Key1下发空行出 ...
- 14--物理引擎Box2D
物理模拟引擎专注于模拟现实世界中物体以及物体之间的基本运动规律.在游戏中引入物理引擎能提高游戏的真实性和可玩性,如<愤怒的小鸟>中小鸟弹出的抛物线运动.<割绳子>中割后的运动等 ...
- POJ2406 KMP算法
POJ2406 问题重述:给定字符串s0,记连续的k个s前后相连组成的s0s0...s0为s0^k.输入字符串S,求最大的k,使得S = s0^k. 问题分析: 1.采用kmp算法求出前缀函数 pre ...
- Python新手学习基础之数据类型——变量
关于Python的变量是这样描述的: 变量是存储在内存里的一个值,通过变量名,我们可以访问到该变量的值. 上面这几行代码中,price,count和sum都是变量,Python是动态类型语言,变量是不 ...
- 窗口!窗口!- Windows程序设计(SDK)003
窗口!窗口! 让编程改变世界 Change the world by program 内容节选: 在前边两节课的例子中,我们通过 MessageBox 函数创建一个消息框程序,消息框其实就是用来跟用户 ...
- C语言初学 if-else语句判断俩数的最大值
#include<stdio.h> main() { float a,b; printf("输入俩个任意实数\n"); scanf("%f%f",& ...
- Xcode6中自动布局autolayout和sizeclass的使用
Xcode6中自动布局autolayout和sizeclass的使用 一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...
- Lintcode--005(最长公共子序列)
Given two strings, find the longest common subsequence (LCS). 最长公共子序列 Your code should return th ...
- angularJs项目实战!03:angularjs与其他类库的协作
引言:angularjs是一个中等重量级的前端开发框架 HTML是一门很好的为静态文本设计的语言,但要构建动态的web应用它就显的乏力了.通常,我们使用以下技术来解决静态网页技术在构建动态应用上的不足 ...