这篇文章主要围绕javascript–在backbone.js中使用bind传递上下文和jsbind传参展开,旨在为您提供一份详细的参考资料。我们将全面介绍javascript–在backbone.j
这篇文章主要围绕javascript – 在backbone.js中使用bind传递上下文和js bind传参展开,旨在为您提供一份详细的参考资料。我们将全面介绍javascript – 在backbone.js中使用bind传递上下文的优缺点,解答js bind传参的相关问题,同时也会为您带来Backbone.js 1.2.2 发布,JavaScript 的 MVC 框架、backbone.js – 如何根据模型javascript数组属性正确显示Backbone牵线木偶集合视图?、JavaScript MVC 框架 backbone.js 初探、Javascript MVC框架Backbone.js详解_javascript技巧的实用方法。
本文目录一览:- javascript – 在backbone.js中使用bind传递上下文(js bind传参)
- Backbone.js 1.2.2 发布,JavaScript 的 MVC 框架
- backbone.js – 如何根据模型javascript数组属性正确显示Backbone牵线木偶集合视图?
- JavaScript MVC 框架 backbone.js 初探
- Javascript MVC框架Backbone.js详解_javascript技巧
javascript – 在backbone.js中使用bind传递上下文(js bind传参)
但是,当我执行单击时,我得到以下内容:
Uncaught TypeError: Cannot call method 'get' of undefined
看来,我正在记录的“这个”实际上就是模型本身:
_callbacks: Object _changed: true _escapedAttributes: Object _prevIoUsAttributes: Object attributes: Object cid: "c0" collection: r.d id: "f5589ba4-a0aa-dd86-9697-30e532e0f975" __proto__: n
我无法通过将我的上下文传递给model.bind来弄清楚为什么不能保留适当的“this”.
这是我的代码:
// Models window.Panel = Backbone.Model.extend({ defaults: function(){ return { flipped: false,}; },toggle: function(){ this.save({flipped: !this.get("flipped")}); },}); // Collections window.PanelList = Backbone.Collection.extend({ model:Panel,localStorage: new Store("panels"),flipped: function(){ return this.filter(function(panel){ return panel.get("flipped"); }) } }); // Global collection of Panels window.Panels = new PanelList; // Panel View window.PanelView = Backbone.View.extend({ tagName: 'div',template: _.template($("#panel-template").html()),events: { "click" : "toggle" },initialize: function(){ this.model.bind("change",this.render,this) $(this.el).html(this.template(this.model.toJSON())); },render: function(){ console.log(this); var flipped = this.model.get("flipped") if (flipped){ $(this.el).addClass("flip"); } else{ $(this.el).removeClass("flip"); } return this },toggle: function(){ this.model.toggle(); } });
解决方法
initialize: function(){ _.bindAll(this,"render"); this.model.bind("change",this.render) $(this.el).html(this.template(this.model.toJSON())); }
_.bindAll做了什么记录here,但它基本上是为此目的而构建的.如果要在对象的所有函数中正确设置此项,则可以在没有函数列表的情况下调用_.bindAll(this).在我的大多数视图中,我倾向于使用此全局绑定函数.
Backbone.js 1.2.2 发布,JavaScript 的 MVC 框架
Backbone.js 1.2.2 发布,此版本更新内容如下:
Collection methods find, filter, reject, every, some, and partition can now take a model-attributes-style predicate: this.collection.reject({user: ''guybrush''}).
Backbone Events once again supports multiple-event maps (obj.on({''error change'': action})). This was a previously undocumented feature inadvertently removed in 1.2.0.
Added Collection#includes as an alias of Collection#contains and as a replacement for Collection#include in Underscore.js >= 1.8.
下载:
开发版:http://backbonejs.org/backbone.js
稳定版:http://backbonejs.org/backbone-min.js
测试版:https://raw.github.com/jashkenas/backbone/master/backbone.js
Backbone.js 是一种重量级javascript MVC 应用框架,通过Models进行key-value绑定及custom事件处理,通过Collections提供一套丰富的API用于枚举功能,通过 Views来进行事件处理及与现有的Application通过RESTful JSON接口进行交互.
backbone.js – 如何根据模型javascript数组属性正确显示Backbone牵线木偶集合视图?
目前,我在集合视图中显示集合时遇到问题.该集合是现有模型的属性,如此(伪代码)
ApplicationVersion { Id: 1,VersionName: "",ApplicationCategories[] }
所以基本上ApplicationVersion有一个名为ApplicationCategories的属性,它是一个javascript数组.目前,当我渲染与ApplicationCategories相关联的集合视图时,不会呈现任何内容.如果我在Chrome的javascript调试器中调试,似乎尚未填充类别(因此我假设还没有提取ApplicationVersion).这是我目前的代码
ApplicationCategory模型,集合和视图
ApplicationModule.ApplicationCategory = Backbone.Model.extend({ urlRoot:"/applicationcategories" }); ApplicationModule.ApplicationCategories = Recruit.Collection.extend({ url:"/applicationcategories",model:ApplicationModule.ApplicationCategory,initialize: function(){ /* * By default backbone does not bind the collection change event to the comparator * for performance reasons. I am choosing to not preoptimize though and do the * binding. This may need to change later if performance becomes an issue. * See https://github.com/documentcloud/backbone/issues/689 * * Note also this is only nescessary for the default sort. By using the * SortableCollectionMixin in other sorting methods,we do the binding * there as well. */ this.on("change",this.sort); },comparator: function(applicationCategory) { return applicationCategory.get("order"); },byName: function() { return this.sortedBy(function(applicationCategory) { return applicationCategory.get("name"); }); } }); _.extend(ApplicationModule.ApplicationCategories.prototype,SortableCollectionMixin); ApplicationModule.ApplicationCategoryView = Recruit.ItemView.extend({ template:"application/applicationcategory-view-template" }); ApplicationModule.ApplicationCategoriesView = Recruit.CollectionView.extend({ itemView:ApplicationModule.ApplicationCategoryView });
ApplicationCategory模板
<section id="<%=name%>"> <%=order%> </section>
ApplicationVersion模型,集合和视图
ApplicationModule.ApplicationVersion = Backbone.Model.extend({ urlRoot:"/applicationversions" }); ApplicationModule.ApplicationVersions = Recruit.Collection.extend({ url:"/applicationversions",model:ApplicationModule.ApplicationVersion }); ApplicationModule.ApplicationVersionLayout = Recruit.Layout.extend({ template:"application/applicationversion-view-template",regions: { applicationVersionHeader: "#applicationVersionHeader",applicationVersionCategories: "#applicationVersionCategories",applicationVersionFooter: "#applicationVersionFooter" } }); ApplicationModule.ApplicationVersionController = { showApplicationVersion: function (applicationVersionId) { ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId}); var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({ model:ApplicationModule.applicationVersion }); ApplicationModule.applicationVersion.fetch({success: function(){ var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({ collection: ApplicationModule.applicationVersion.application_categories }); applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories); }}); // Fake server responds to the request ApplicationModule.server.respond(); Recruit.layout.main.show(applicationVersionLayout); } };
这是我的ApplicationVersion模板
<section id="applicationVersionOuterSection"> <header id="applicationVersionHeader"> Your Application Header <%= id %> </header> <section id="applicationVersionCategories"> </section> <footer id="applicationVersionFooter"> Your footer </footer>
有一点需要注意我正在使用Sinon来模拟我的服务器响应,但我不认为这会导致问题,因为它正在响应信息,因为我期望通过javascript调试器查看(就像我说它显示的是ApplicationVersion id正确).如果它有帮助,我也可以提供此代码
它当前正在显示应用程序版本ID(模板中的id),因此我知道它正在为正常属性正确获取数据,它只是不呈现我的ApplicationCategories javascript数组属性.
因此,最终我对ApplicationVersion的获取成功具有约束力,然后为ApplicationCategories设置视图.因为这不像我预期的那样工作,我想知道是否有更好的方法来创建这个集合视图?
谢谢你的帮助
更新:Derek Bailey带领我的工作代码示例.
ApplicationModule.ApplicationVersionController = { showApplicationVersion: function (applicationVersionId) { ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId}); var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({ model:ApplicationModule.applicationVersion }); ApplicationModule.applicationVersion.fetch(); // Fake server responds to the request ApplicationModule.server.respond(); Recruit.layout.main.show(applicationVersionLayout); var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({ collection: new Backbone.Collection(ApplicationModule.applicationVersion.get('application_categories')) }); applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories); } };
解决方法
new MyView({ collection: new Backbone.Collection(MyModel.something.ArrayOfThings) });
JavaScript MVC 框架 backbone.js 初探

什么是 backbone
backbone 不是脊椎骨,而是帮助开发重量级的 javascript 应用的框架。
主要提供了 3 个东西:1、models (模型) 2、collections (集合) 3、views (视图)
backbone.js 文件本身很小,压缩后只有 5.3KB,作为一个框架级别的核心 JS 文件,这个数字很可怕。
除此之外,这个 JS 还必须依赖于另一个 JS 文件:underscore.js (包含许多工具方法,集合操作,js 模板等等)。
简介
用 Backbone.Model 表示应用中所有数据,models 中的数据可以创建、校验、销毁和保存到服务端。
当 models 中值被改变时自动触发一个 "change" 事件、所有用于展示 models 数据的 views 都会侦听到这个事件,然后进行重新渲染。
Backbone.Collection 和我们平时接触的 JAVA 集合类相似,具有增加元素,删除元素,获取长度,排序,比较等一系列工具方法,说白了就是一个保存 models 的集合类。
Backbone.View 中可以绑定 dom el 和客户端事件。页面中的 html 就是通过 views 的 render 方法渲染出来的,当新建一个 view 的时候通过要传进一个 model 作为数据,例如:
Js 代码:
var view = new EmployeeView({model:employee});
也就是说 model 就是以这种方式和 view 进行关联的。
特点
创建 models 或者 views 的语法:extends,相当于类继承
models 的创建,销毁,校验等一系列改变都会触发相应的事件
示例
需求:用 backbone.js 和 jquery 实现一个可编辑的员工信息表格。
功能:1、录入员工信息。2、删除员工信息。3、双击表格可对员工信息进行修改。4、能对员工信息进行有效性校验。5、能对员工信息进行持久化。
设计:
用 Employee 类 (继承自 Backbone.Model) 表示员工信息,包含 ID、姓名、性别、年龄和职位字段。
Js 代码:
window.Employee = Backbone.Model.extend({
// 模型值校验
validate:function(attrs){
for(var key in attrs){
if(attrs[key] == ''''){
return key + "不能为空";
}//www.sctarena.com
if(key == ''age'' && isNaN(attrs.age)){
return "年龄必须是数字";
}
}
}
});
声明 Employee 类之后就可以新增一个 Employee 的示例对象了:
Js 代码:
var employee = new Employee();
Employee 类中不必声明 ID、姓名等业务字段。当需要给 employee 设置这些信息时候,只需要调用
Js 代码:
employee.set({''id'':1,''name'':''Jason''});
当然,如果需要对 employee 的信息进行校验,需要给 Employee 类配置一个 validate 方法,这个方法的参数 attrs 就是 set 进去的 json 数据。这样,当 employee 里面的数据每次发生改变的时候都会先调用这个 validate 方法。
Model 类定义好之后就可以开始定义集合类了,在集合类里面可以对里面的每个 Model 进行增加,删除等一系列操作,还可以调用 fetch 方法从 server 端获取集合的初始值。
Js 代码:
window.EmployeeList = Backbone.Collection.extend({
model : Employee,
// 持久化到本地数据库
localStorage: new Store("employees"),
});
window.Employees = new EmployeeList();
成都 java 培训
设置 localStorage 属性后 Employees 里面的数据自动会同步保存到本地数据库里面,每当调用 Employees.fetch () 后又会从 localStorage 里面恢复数据。
View 类主要负责一切和界面相关的工作,比如绑定 html 模板,绑定界面元素的事件,初始的渲染,模型值改变后的重新渲染和界面元素的销毁等:
Js 代码:
window.EmployeeView = Backbone.View.extend({
tagName : ''tr'',
template : _.template($(''#item-template'').html()),
events : {
"dblclick td" : "edit",
"blur input,select" : "close",
"click .del" : "clear",
},
initialize : function(){
// 每次更新模型后重新渲染
this.model.bind(''change'', this.render, this);
// 每次删除模型之后自动移除 UI
this.model.bind(''destroy'', this.remove, this);
},
setText : function(){
var model = this.model;
this.input = $(this.el).find(''input,select'');
this.input.each(function(){
var input = $(this);
input.val(model.get(input.attr("name")));
});
},
close: function(e) {
var input = $(e.currentTarget);
var obj = {};
obj[input.attr(''name'')] = input.val();
this.model.save(obj);
$(e.currentTarget).parent().parent().removeClass("editing");
},
edit : function(e){
// 给 td 加上 editing 样式
$(e.currentTarget).addClass(''editing'').find(''input,select'').focus();
},
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
// 把每个单元格的值赋予隐藏的输入框
this.setText();
return this;
},
remove: function() {
$(this.el).remove();
},
clear: function() {
this.model.destroy();
}
});
这个类里面的代码比较多,但主要和界面的渲染有关。一个 EmployeeView 对象对应 table 里面的一个 tr 元素。每次 new 一个 EmployeeView 对象的时候都会先调用 initialize 方法,这个方法里面绑定的事件确保了 tr 元素对应的 model 值每次发生改变或者被删除时都会同步到界面。也就是说当每次操作界面对数据进行修改后都是先把当前的变更保存到 view 绑定的 model 对象里面,然后 model 里面的事件机制会自动触发一个 "change" 事件对界面进行修改。
template 中使用的方法_.template ($(''#item-template'').html ()) 是前面提到的 underscore.js 中提供一个工具方法,可以通过界面的 HTML 模板和一个 JSON 生成动态的 HTML,说白了就是把 JSON 里面的值填充到 HTML 模板中对应的占位符里面去,牛 X 的是 HTML 模板里面支持一些常用的逻辑表达式如 if,else,foreach 等:
Html 代码:
<script type="text/template" id="item-template">
<td><%= eid %></td>
<td>
<div><%= username %></div>
<div><inputname="username"></input></div>
</td>
<td>
<div><%= sex=="1" ? "女":"男" %></div>
<div>
<select name="sex">
<option value="0"> 男 </option><option value="1"> 女 </option>
</select>
</div>
</td>
<td>
<div><%= age %></div>
<div>
<inputname="age"></input>
</div>
</td>
<td>
<div><%= position %></div>
<div>
<inputname="position"></input>
</div>
</td>
<td>
<a href="#"> 删除 </a>
</td>
</script>
setText 方法主要负责把 model 里面的数据设置到每个 tr 里面的隐藏输入域里面。
close 方法被绑定到了 input 和 select 元素的 blur 事件中。当用户对单元格数据进行修改后都会把鼠标点击到界面其他地方然后输入框会自动隐藏并且把修改的数据显示在表格上面。close 方法首先从当前被编辑的元素中拿到最新值,然后封装成一个对象,调用 model 的 save 方法后首先执行 model 的 validate 方法,如果校验通过则保存到本地存储并触发 "change" 事件。
最后还需要一个主界面 View,这个 View 主要绑定了界面中的录入表单的 “增加” 按钮事件,Employees 的相关事件以及页面初始化时从本地存储中恢复数据:
Js 代码:
window.AppView = Backbone.View.extend({
el : $("#app"),
events : {
"click .#add-btn" : "createOnEnter"
},
// 绑定 collection 的相关事件
initialize: function() {
Employees.bind(''add'', this.addOne, this);
// 调用 fetch 的时候触发 reset
Employees.bind(''reset'', this.addAll, this);
Employees.fetch();
},
createOnEnter : function(e) {
var employee = new Employee();
var attr = {};
$(''#emp-form input,#emp-form select'').each(function(){
var input = $(this);
attr[input.attr(''name'')] = input.val();
});
employee.bind(''error'',function(model,error){
alert(error);
});
//set 方法中会自动调用 model 的 validate 方法进行校验,如果不通过则返回 false
if(employee.set(attr)){
Employees.create(employee);
}
},
addOne : function(employee){
employee.set({"eid":employee.get("eid")||Employees.length});
employee.bind(''error'',function(model,error){
alert(error);
});
var view = new EmployeeView({model:employee});
$(".emp-table tbody").append(view.render().el);
},
addAll : function(){
Employees.each(this.addOne);
}
});
initialize 方法中绑定了 Employees 的 add 和 reset 事件,也就是说每当往 Employees 中添加一个 model 的时候都会调用 AppView 的 addOne 方法,这个方法主要绑定了 model 的 error 事件以及把 EmployeeView 生成的 html 插入到界面中的合适位置。
OK,万事俱备,只欠启动,整个应用的初始化方法就是 AppView 的 initialize 方法,因此只需要新建一个 AppView 就可以了:
Js 代码
window.App = new AppView();
整个示例的 JS 代码很少,加上注释只有 100 行左右,感兴趣的可以下载看看。由于示例使用到了本地存储,所以不要用 IE 运行示例,你懂的。
Javascript MVC框架Backbone.js详解_javascript技巧
随着javascript程序变得越来越复杂,往往需要一个团队协作开发,这时代码的模块化和组织规范就变得异常重要了。mvc模式就是代码组织的经典模式。
(……MVC介绍。)
(1)Model
Model表示数据层,也就是程序需要的数据源,通常使用JSON格式表示。
(2)View
立即学习“Java免费学习笔记(深入)”;
View表示表现层,也就是用户界面,对于网页来说,就是用户看到的网页HTML代码。
(3)Controller
Controller表示控制层,用来对原始数据(Model)进行加工,传送到View。
由于网页编程不同于客户端编程,在MVC的基础上,JavaScript社区产生了各种变体框架MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等等,有人就把所有这一类框架的各种模式统称为MV*。
框架的优点在于合理组织代码、便于团队合作和未来的维护,缺点在于有一定的学习成本,且限制你只能采取它的写法。
Backbone的加载
Backbone.View
基本用法
Backbone.View方法用于定义视图类。
var AppView = Backbone.View.extend({
render: function(){
$(''main'').append(''
一级标题
'');}
});