随着JavaScript程序变得越来越复杂,往往需要一个团队协作开发,这时代码的模块化和组织规范就变得异常重要了。MVC模式就是代码组织的经典模式。
(……MVC介绍。)
(1)Model
Model表示数据层,也就是程序需要的数据源,通常使用JSON格式表示。
(2)View
View表示表现层,也就是用户界面,对于网页来说,就是用户看到的网页HTML代码。
(3)Controller
Controller表示控制层,用来对原始数据(Model)进行加工,传送到View。
由于网页编程不同于客户端编程,在MVC的基础上,JavaScript社区产生了各种变体框架MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等等,有人就把所有这一类框架的各种模式统称为MV*。
框架的优点在于合理组织代码、便于团队合作和未来的维护,缺点在于有一定的学习成本,且限制你只能采取它的写法。
Backbone的加载
<script src="/javascripts/lib/jquery.js"></script> <script src="/javascripts/lib/underscore.js"></script> <script src="/javascripts/lib/backbone.js"></script> <script src="/javascripts/jst.js"></script> <script src="/javascripts/router.js"></script> <script src="/javascripts/init.js"></script>
Backbone.View
基本用法
Backbone.View方法用于定义视图类。
var AppView = Backbone.View.extend({ render: function(){ $('main').append('<h1>一级标题</h1>'); } });
上面代码通过Backbone.View的extend方法,定义了一个视图类AppView。该类内部有一个render方法,用于将视图放置在网页上。
使用的时候,需要先新建视图类的实例,然后通过实例,调用render方法,从而让视图在网页上显示。
var appView = new AppView(); appView.render();
新建视图实例时,通常需要指定Model。
var document = new Document({ model: doc });
initialize方法
视图还可以定义initialize方法,生成实例的时候,会自动调用该方法对实例初始化。
var AppView = Backbone.View.extend({ initialize: function(){ this.render(); }, render: function(){ $('main').append('<h1>一级标题</h1>'); } }); var appView = new AppView();
上面代码定义了initialize方法之后,就省去了生成实例后,手动调用appView.render()的步骤。
el属性,$el属性
除了直接在render方法中,指定“视图”所绑定的网页元素,还可以用视图的el属性指定网页元素。
var AppView = Backbone.View.extend({ el: $('main'), render: function(){ this.$el.append('<h1>一级标题</h1>'); } });
tagName属性,className属性
如果不指定el属性,也可以通过tagName属性和className属性指定。
var Document = Backbone.View.extend({ tagName: "li", className: "document", render: function() { // ... } });
template方法
视图的template属性用来指定网页模板。
var AppView = Backbone.View.extend({ template: _.template("<h3>Hello <%= who %><h3>"), });
var AppView = Backbone.View.extend({ el: $('#container'), template: _.template("<h3>Hello <%= who %><h3>"), initialize: function(){ this.render(); }, render: function(){ this.$el.html(this.template({who: 'world!'})); } });
实际应用中,一般将模板放在script标签中,为了防止浏览器按照JavaScript代码解析,type属性设为text/template。
<script type="text/template" data-name="templateName"> <!-- template contents goes here --> </script>
window.templates = {}; var $sources = $('script[type="text/template"]'); $sources.each(function(index, el) { var $el = $(el); templates[$el.data('name')] = _.template($el.html()); });
events属性
events属性用于指定视图的事件及其对应的处理函数。
var Document = Backbone.View.extend({ events: { "click .icon": "open", "click .button.edit": "openEditDialog", "click .button.delete": "destroy" } });
listento方法
listento方法用于为特定事件指定回调函数。
var Document = Backbone.View.extend({ initialize: function() { this.listenTo(this.model, "change", this.render); } });
remove方法
remove方法用于移除一个视图。
updateView: function() { view.remove(); view.render(); };
子视图(subview)
在父视图中可以调用子视图。下面就是一种写法。
render : function (){ this.$el.html(this.template()); this.child = new Child(); this.child.appendTo($.('.container-placeholder').render(); }
Backbone.Router
Router是Backbone提供的路由对象,用来将用户请求的网址与后端的处理函数一一对应。
首先,新定义一个Router类。
Router = Backbone.Router.extend({ routes: { } });
routes属性
Backbone.Router对象中,最重要的就是routes属性。它用来设置路径的处理方法。
routes属性是一个对象,它的每个成员就代表一个路径处理规则,键名为路径规则,键值为处理方法。
如果键名为空字符串,就代表根路径。
routes: { '': 'phonesIndex', }, phonesIndex: function () { new PhonesIndexView({ el: 'section#main' }); }
var AppRouter = Backbone.Router.extend({ routes: { "*actions": "defaultRoute" } }); var app_router = new AppRouter; app_router.on('route:defaultRoute', function(actions) { console.log(actions); })
路径规则的写法。
var myrouter = Backbone.Router.extend({ routes: { "help": "help", "search/:query": "search" }, help: function() { ... }, search: function(query) { ... } }); routes: { "help/:page": "help", "download/*path": "download", "folder/:name": "openFolder", "folder/:name-:mode": "openFolder" } router.on("route:help", function(page) { ... });
Backbone.history
设置了router以后,就可以启动应用程序。Backbone.history对象用来监控url的变化。
App = new Router(); $(document).ready(function () { Backbone.history.start({ pushState: true }); });
Backbone.history.start({pushState: true, root: "/public/search/"}) Backbone.Model
var User = Backbone.Model.extend({ defaults: { name: '', email: '' } }); var user = new User();
生成实例时,可以提供各个属性的具体值。
var user = new User ({ id: 1, name: 'name', email: 'name@email.com' });
idAttribute属性
Model实例必须有一个属性,作为区分其他实例的主键。这个属性的名称,由idAttribute属性设定,一般是设为id。
var Music = Backbone.Model.extend({ idAttribute: 'id' });
get方法
get方法用于返回Model实例的某个属性的值。
var user = new User({ name: "name", age: 24}); var age = user.get("age"); // 24 var name = user.get("name"); // "name"
set方法
set方法用于设置Model实例的某个属性的值。
var User = Backbone.Model.extend({ buy: function(newCarsName){ this.set({car: newCarsName }); } }); var user = new User({name: 'BMW',model:'i8',type:'car'}); user.buy('Porsche'); var car = user.get("car"); // ‘Porsche'
on方法
on方法用于监听对象的变化。
var user = new User({name: 'BMW',model:'i8'}); user.on("change:name", function(model){ var name = model.get("name"); // "Porsche" console.log("Changed my car's name to " + name); }); user.set({name: 'Porsche'}); // Changed my car's name to Porsche
urlroot属性
该属性用于指定服务器端对model进行操作的路径。
var User = Backbone.Model.extend({ urlRoot: '/user' });
上面代码指定,服务器对应该Model的路径为/user。
fetch事件
fetch事件用于从服务器取出Model。
var user = new User ({id: 1}); user.fetch({ success: function (user){ console.log(user.toJSON()); } })
save方法
save方法用于通知服务器新建或更新Model。
如果一个Model实例不含有id属性,则save方法将使用POST方法新建该实例。
var User = Backbone.Model.extend({ urlRoot: '/user' }); var user = new User (); var userDetails = { name: 'name', email: 'name@email.com' }; user.save(userDetails, { success: function (user) { console.log(user.toJSON()); } })
如果一个Model实例含有id属性,则save方法将使用PUT方法更新该实例。
var user = new User ({ id: 1, name: '张三', email: 'name@email.com' }); user.save({name: '李四'}, { success: function (model) { console.log(user.toJSON()); } });
destroy方法
destroy方法用于在服务器上删除该实例。
var user = new User ({ id: 1, name: 'name', email: 'name@email.com' }); user.destroy({ success: function () { console.log('Destroyed'); } });
Backbone.Collection
Collection是同一类Model的集合,比如Model是动物,Collection就是动物园;Model是单个的人,Collection就是一家公司。
var Song = Backbone.Model.extend({}); var Album = Backbone.Collection.extend({ model: Song });
add方法,remove方法
Model的实例可以直接放入Collection的实例,也可以用add方法添加。
var song1 = new Song({ id: 1 ,name: "歌名1", artist: "张三" }); var song2 = new Music ({id: 2,name: "歌名2", artist: "李四" }); var myAlbum = new Album([song1, song2]); var song3 = new Music({ id: 3, name: "歌名3",artist:"赵五" }); myAlbum.add(song3);
myAlbum.remove(1);
get方法,set方法
get方法用于从Collection中获取指定id的Model实例。
myAlbum.get(2))
fetch方法
fetch方法用于从服务器取出Collection数据。
var songs = new Backbone.Collection; songs.url = '/songs'; songs.fetch();
var obj = {}; _.extend(obj, Backbone.Events); obj.on("show-message", function(msg) { $('#display').text(msg); }); obj.trigger("show-message", "Hello World");
MVC框架 零框架解决方案 Backbone的加载 Backbone的用法 Backbone.View 基本用法 initialize方法 el属性,$el属性 tagName属性,className属性 template方法 events属性 listento方法 remove方法 子视图(subview) Backbone.Router routes属性 Backbone.history Ba
JavaScriptMVC 是一个 JavaScript 的 MVC 框架,通过它可以简化项目的开发,支持流行的各种浏览器。 目录结构: 压缩效果:
本文向大家介绍JavaScript的Backbone.js框架入门学习指引,包括了JavaScript的Backbone.js框架入门学习指引的使用技巧和注意事项,需要的朋友参考一下 1.简介 最近在做一个大型网上银行项目前端的优化,需要使用一个胖客户端的优化,大概思路就是前端通过Ajax 请求去后端获取数据,以Jason的格式返回,然后显示在页面上。由于这个系统非常庞大,胖客户端方案难免需要在客
本文向大家介绍Backbone.js框架中Model与Collection的使用实例,包括了Backbone.js框架中Model与Collection的使用实例的使用技巧和注意事项,需要的朋友参考一下 Model 关于backbone,最基础的一个东西就是model,这个东西就像是后端开发中的数据库映射那个model一样,也是数据对象的模型,并且应该是和后端的model有相同的属性(仅是需要通过
本文向大家介绍深入解析JavaScript框架Backbone.js中的事件机制,包括了深入解析JavaScript框架Backbone.js中的事件机制的使用技巧和注意事项,需要的朋友参考一下 事件模型及其原理 Backbone.Events就是事件实现的核心,它可以让对象拥有事件能力 对象通过listenTo侦听其他对象,通过trigger触发事件。可以脱离Backbone的MVC,在自定义的
本文向大家介绍讲解JavaScript的Backbone.js框架的MVC结构设计理念,包括了讲解JavaScript的Backbone.js框架的MVC结构设计理念的使用技巧和注意事项,需要的朋友参考一下 什么是Backbone.js? Backbone.js是十大JS框架之首,Backbone.js 是一个重量级js MVC 应用框架,也是js MVC框架的鼻祖。它通过Models数据模型进