本文的目的是介绍深入解析Backbone.js框架的依赖库Underscore.js的作用的详细情况,特别关注backgrounderaction12依赖的相关信息。我们将通过专业的研究、有关数据的分
本文的目的是介绍深入解析Backbone.js框架的依赖库Underscore.js的作用的详细情况,特别关注backgrounderaction12依赖的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解深入解析Backbone.js框架的依赖库Underscore.js的作用的机会,同时也不会遗漏关于Backbone JS框架指南、Backbone React Requirejs 应用实战(二)——使用Backbone Model、Backbone 模板 underscore template默认的转义符<%= %> 与jsp的冲、backbone.js – “未捕获TypeError:undefined不是函数”初始化Backbone集合的知识。
本文目录一览:- 深入解析Backbone.js框架的依赖库Underscore.js的作用(backgrounderaction12依赖)
- Backbone JS框架指南
- Backbone React Requirejs 应用实战(二)——使用Backbone Model
- Backbone 模板 underscore template默认的转义符<%= %> 与jsp的冲
- backbone.js – “未捕获TypeError:undefined不是函数”初始化Backbone集合
深入解析Backbone.js框架的依赖库Underscore.js的作用(backgrounderaction12依赖)
backbone必须依赖underscore.js才能够使用,它必须通过underscore中的函数来完成访问页面元素、处理元素的基本操作。 注:backbone可以很好的与其它js库一起工作,所以说它是一个库,而不是框架。 Underscore并没有对原生对象进行扩展,而是调用_()方法进行封装,一旦封装完成,js对象就变为Underscore对象,也可以通过Underscore对象的Value()方法获取原生js对象中的数据。(jquery通过$()方法得到Jquery对象) Underscore总共有60多个函数,按照处理对象的不同,可以分为集合类、数组类、功能函数类、对象类、工具函数类五大类模块。
underscore template()函数说明:
该函数包含三种模板:
(1)<% %>:包含逻辑代码,渲染后不会展现。 (2)<%= %>:数据类型,渲染后展示数据。 (3)<%- %>:将HTML标记转换为常用字符串,以避免代码攻击。
调用格式:
没有实现双向数据绑定。
1、Underscore对象封装
Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文中称“Underscore对象”)。 你可以通过调用一个Underscore对象的value()方法来获取原生的JavaScript数据,例如:// 通过_()方法将对象创建为一个Underscore对象
// underscoreData对象的原型中包含了Underscore中定义的所有方法,你可以任意使用
var underscoreData = _(jsData);
// 通过value方法获取原生数据,即jsData
underscoreData.value();
2、优先调用JavaScript 1.6内置方法
Underscore中有许多方法在JavaScript1.6中已经被纳入规范,因此在Underscore对象内部,会优先调用宿主环境提供的内置方法(如果宿主环境已经实现了这些方法),以此提高函数的执行效率。 而对于不支持JavaScript 1.6的宿主环境,Underscore会通过自己的方式实现,而对开发者来说,这些完全是透明的。 这里所说的宿主环境,可能是Node.js运行环境,或客户端浏览器。3、改变命名空间
Underscore默认使用_(下划线)来访问和创建对象,但这个名字可能不符合我们的命名规范,或容易引起命名冲突。 我们可以通过noConflict()方法来改变Underscore的命名,并恢复_(下划线)变量之前的值,例如:你能看到,我们的代码非常简洁,节流控制在debounce()方法中已经被实现,我们只告诉它当query函数在200毫秒内没有被调用过的话,就执行我们的查询操作,然后再将query函数绑定到输入框的keypress事件。 query函数是怎么来的?我们在调用debounce()方法时,会传递一个执行查询操作的函数和一个时间(毫秒数),debounce()方法会根据我们传递的时间对函数进行节流控制,并返回一个新的函数(即query函数),我们可以放心大胆地调用query函数,而debounce()方法会按要求帮我们做好控制。
需求2:当用户拖动浏览器滚动条时,调用服务器接口检查是否有新的内容 再来分析第2个需求,我们可以将查询方法绑定到window.onscroll事件,但这显然不是一个好的做法,因为用户拖动一次滚动条可能会触发几十次甚至上百次onscroll事件。 我们是否可以使用上面的debounce()方法来进行节流控制?当用户拖动滚动条完毕后,再查询新的内容?但这与需求不符,用户希望在拖动的过程中也能看到新内容的变化。 因此我们决定这样做:用户在拖动时,每两次查询的间隔不少于500毫秒,如果用户拖动了1秒钟,这可能会触发200次onscroll事件,但我们最多只进行2次查询。 利用Underscore中的throttle()方法,我们也可以轻松实现这个需求:
代码仍然十分简洁,因为在throttle()方法内部,已经为我们实现的所有控制。
你可能已经发现,debounce()和throttle()两个方法非常相似(包括调用方式和返回值),作用却又有不同。 它们都是用于函数节流,控制函数不被频繁地调用,节省客户端及服务器资源。 debounce()方法关注函数执行的间隔,即函数两次的调用时间不能小于指定时间。 throttle()方法更关注函数的执行频率,即在指定频率内函数只会被调用一次。
8、模板解析
Underscore提供了一个轻量级的模板解析函数,它可以帮助我们有效地组织页面结构和逻辑。 我将通过一个例子来介绍它:- <%=item.firstName%> <%=item.lastName%> <%-item.city%> <% } %>
<script type="text/template" id="tpl">
<% for(var i = 0; i < list.length; i++) { %>
<% var item = list[i] %>
在本例中,我们将模板内容放到一个
总结
以上是小编为你收集整理的深入解析Backbone.js框架的依赖库Underscore.js的作用全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Backbone JS框架指南
Backbone 是一个前端 JS 代码 MVC 框架,被著名的 37signals 用来构建他们的移动客户端。它不可取代 Jquery,不可取代现有的 template 库。而是和这些结合起来构建复杂的 web 前端交互应用。如果项目涉及大量的 javascript 代码,实现很多复杂的前端交互功能,首先你会想到把数据和展示分离。使用 Jquery 的 selector 和 callback 可以轻松做到这点。但是对于富客户端的WEB应用大量代码的结构化组织非常必要。
Backbone 就提供了 javascript 代码的组织的功能。Backbone 主要包括 models, collections, views 和 events, controller 。
Models 用来创建数据,校验数据,存储数据到服务器端, Collections 包含你创建的 functions ,Views 用来展示数据。
Models 还可以绑定事件。比如用户动作变化触发 models 的 change 事件,所有展示此model 数据的 views 都会接收到 这个 change 事件,进行重绘。
事件的绑定和触发
以下是object 绑定 alert 事件和匿名回调函数的代码例子,object 之后 触发 alert 事件,并且传入参数 “an event”
var object = {};
_.extend(object, Backbone.Events);
object.bind("alert", function(msg) {
alert("Triggered " + msg);
});
object.trigger("alert", "an event");
假如你的网页上事件很多也可以用proxy的方式来分发所有事件:
proxy.bind("all", function(eventName) {
object.trigger(eventName);
});
Backbone 的 Models 是应用的核心
他包含了数据对象的属性,操作数据对象的函数。还实现和服务端交互的动作。
以下是定时从服务器端更新 channel 的数据:
// Poll every 10 seconds to keep the channel model up-to-date.
setInterval(function() {
channel.fetch();
}, 10000);
以下是存储 book 的数据,这里通过重载 sync 函数,只让数据 alert 出来,sync 中的默认触发事件包括 fetch save refresh
Backbone.sync = function(method, model) {
alert(method + ": " + JSON.stringify(model));
};
var book = new Backbone.Model({
title: "The Rough Riders",
author: "Theodore Roosevelt"
});
book.save();
Backbone 的 Controller 用来对 URL 和事件进行绑定
以下下例子中,分别将不同的以#开头的 URL 片段 绑定到不同的函数,实现服务器端 MVC 模型中的 router 一样的功能
var Workspace = Backbone.Controller.extend({
routes: {
"help": "help", // #help
"search/:query": "search", // #search/kiwis
"search/:query/p:page": "search" // #search/kiwis/p7
},
help: function() {
...
},
search: function(query, page) {
...
}
});
值得提出的是 Backbone 的 router 也支持正则表达式的匹配
initialize: function(options) {
// Matches #page/10, passing "10"
this.route("page/:number", "page", function(number){ ... });
// Matches /117-a/b/c/open, passing "117-a/b/c"
this.route(/^(.*?)\/open$/, "open", function(id){ ... });
}
Backbone 的 Sync 默认通过调用Jquery的ajax方法来实现和服务器端的交互,实现数据的 CURD
比如 fetch 方法会触发 read 事件
Backbone 的 Views 用来接收用户的操作和修改 Model 的数据 ,另外通过 render 来展示数据
默认 render 并没有实现,你可以用 Mustache.js 或者 Underscore.js 来实现。
以下是接收用户操作的代码例子:
var DocumentView = Backbone.View.extend({
events: {
"dblclick" : "open",
"click .icon.doc" : "select",
"contextmenu .icon.doc" : "showMenu",
"click .show_notes" : "toggleNotes",
"click .title .lock" : "editAccessLevel",
"mouseover .title .date" : "showTooltip"
},
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
},
open: function() {
window.open(this.model.get("viewer_url"));
},
select: function() {
this.model.set({selected: true});
},
...
});
以下是数据渲染 render 的例子
var Bookmark = Backbone.View.extend({
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
}
});
参考
http://documentcloud.github.com/backbone/
http://documentcloud.github.com/backbone/examples/todos/index.html
Also see:
CoffeeScript – 未来可以取代 JavaScript 的语言
3 Tips of linux uses and 1 tip of Jquery
jQuery初探
Backbone React Requirejs 应用实战(二)——使用Backbone Model
在一篇《Backbone React Requirejs 应用实战(一)——RequireJS管理React依赖》,我们介绍了如何使用Requirejs管理我们的JS,这一篇让我们来看看如何使用model。
react.backbone
react.backbone简介
项目首页: https://github.com/clayallsopp/react.backbone
Plugin for React to make Backbone integration easier. Initialize your component with a Backbone.Model or Backbone.Collection; when the model or collection changes,#render will be called.
安装
bower install react.backbone --save-dev
README上有这样一个例子:
var UserViewComponent = React.createBackboneClass({ changeOptions: "change:name",// DEFAULT is "change",render: function() { return ( <div> <h1>{this.getModel().get("name")}</h1> </div> ); } }); var user = new Backbone.Model(); var UserView = React.createFactory(UserViewComponent); var userView = UserView({model: user});
可惜太长了。让我们来作一个简单的例子:
React使用Backbone Model
记得在上一篇中,我们提到了router,在Router里的project是这样子的:
project: function(){ var user = new usermodel({name: 'phodal'}); var UserView = React.createFactory(ProjectComponent); var userView = new UserView({model: user}); React.render(userView,document.getElementById('main_content')); },
而usermodel则是一个简单的model
define(['backbone'],function(Backbone) { var usermodel = Backbone.Model.extend({ initialize : function(name) { this.name = name; },defaults:{ name:null } }); return usermodel; });
我们用到了一个叫ProjectComponent的component,最后将它渲染到main_content这个id上。
我们的projectcomponent是这样子的:
define([ 'react','react.backbone' ],function(React){ return React.createBackboneClass({ render: function () { return ( <div> <h1>{this.getModel().get('name')}</h1> Project </div>); } }); });
从我们的model里面获取``name`。
这样,我们就可以简单地在我们的应用中使用Backbone Model。
其他
Github: https://github.com/phodal/backbone-react
Backbone 模板 underscore template默认的转义符<%= %> 与jsp的冲
先定义转义符,因为默认的转义符<%= %> 与jsp的冲突(如果js模板写在jsp页面中)
_.templateSettings = {
interpolate : /\{\{(.+?)\}\}/g
};
<script type="text/template" id="detailedBar-template">
<div title''>
<span label''>本次消费</span>
<span numOfDinner''>{{numOfDiner}}人用餐</span>
<span amount''><span symbol''>{{currencySymbol}}</span>{{amount}}</span>
</div>
</script>
backbone.js – “未捕获TypeError:undefined不是函数”初始化Backbone集合
var FooCollection = Backbone.Collection.extend({ model:Foo,initialize: function (attributes,options) { this.barId = options.barId; } }); var Foo = Backbone.Model.extend({});
当我尝试初始化这个,我得到Backbone.Collection的_prepareModel()函数中的“未捕获TypeError:undefined不是一个函数”.
不好的电话是在model = new this.model(attrs,options)中.
// Prepare a model or hash of attributes to be added to this collection. _prepareModel: function(model,options) { options || (options = {}); if (!(model instanceof Model)) { var attrs = model; options.collection = this; model = new this.model(attrs,options); // <-- BLOWS UP HERE if (!model._validate(model.attributes,options)) model = false; } else if (!model.collection) { model.collection = this; } return model; },
当我在调试器中通过_prepareModel()时,它看起来像这个时候的类型是child,而this.model实际上是未定义的.
有谁能告诉我我做错了什么?
解决方法
@H_301_17@ 在我的实际代码中,Foo在FooCollection之后被声明.没有意识到Javascript不支持前向声明. [headdesk]关于深入解析Backbone.js框架的依赖库Underscore.js的作用和backgrounderaction12依赖的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Backbone JS框架指南、Backbone React Requirejs 应用实战(二)——使用Backbone Model、Backbone 模板 underscore template默认的转义符<%= %> 与jsp的冲、backbone.js – “未捕获TypeError:undefined不是函数”初始化Backbone集合等相关知识的信息别忘了在本站进行查找喔。
本文标签: