GVKun编程网logo

深入解析Backbone.js框架的依赖库Underscore.js的作用(backgrounderaction12依赖)

14

本文的目的是介绍深入解析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框架的依赖库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标记转换为常用字符串,以避免代码攻击。

调用格式:

rush:js;"> _.template(templateString,[data],[setting])

没有实现双向数据绑定。

1、Underscore对象封装

Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文中称“Underscore对象”)。 你可以通过调用一个Underscore对象的value()方法来获取原生的JavaScript数据,例如:

rush:js;"> // 定义一个JavaScript内置对象 var jsData = { name : 'data' }

// 通过_()方法将对象创建为一个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的命名,并恢复_(下划线)变量之前的值,例如:

rush:js;">

你能看到,我们的代码非常简洁,节流控制在debounce()方法中已经被实现,我们只告诉它当query函数在200毫秒内没有被调用过的话,就执行我们的查询操作,然后再将query函数绑定到输入框的keypress事件。 query函数是怎么来的?我们在调用debounce()方法时,会传递一个执行查询操作的函数和一个时间(毫秒数),debounce()方法会根据我们传递的时间对函数进行节流控制,并返回一个新的函数(即query函数),我们可以放心大胆地调用query函数,而debounce()方法会按要求帮我们做好控制。

需求2:当用户拖动浏览器滚动条时,调用服务器接口检查是否有新的内容 再来分析第2个需求,我们可以将查询方法绑定到window.onscroll事件,但这显然不是一个好的做法,因为用户拖动一次滚动条可能会触发几十次甚至上百次onscroll事件。 我们是否可以使用上面的debounce()方法来进行节流控制?当用户拖动滚动条完毕后,再查询新的内容?但这与需求不符,用户希望在拖动的过程中也能看到新内容的变化。 因此我们决定这样做:用户在拖动时,每两次查询的间隔不少于500毫秒,如果用户拖动了1秒钟,这可能会触发200次onscroll事件,但我们最多只进行2次查询。 利用Underscore中的throttle()方法,我们也可以轻松实现这个需求:

rush:js;">

代码仍然十分简洁,因为在throttle()方法内部,已经为我们实现的所有控制。

你可能已经发现,debounce()和throttle()两个方法非常相似(包括调用方式和返回值),作用却又有不同。 它们都是用于函数节流,控制函数不被频繁地调用,节省客户端及服务器资源。 debounce()方法关注函数执行的间隔,即函数两次的调用时间不能小于指定时间。 throttle()方法更关注函数的执行频率,即在指定频率内函数只会被调用一次。

8、模板解析

Underscore提供了一个轻量级的模板解析函数,它可以帮助我们有效地组织页面结构和逻辑。 我将通过一个例子来介绍它:

rush:js;">

在本例中,我们将模板内容放到一个

总结

以上是小编为你收集整理的深入解析Backbone.js框架的依赖库Underscore.js的作用全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Backbone 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 应用实战(二)——使用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的冲

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集合

backbone.js – “未捕获TypeError:undefined不是函数”初始化Backbone集合

我有一个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集合等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇JavaScript的Backbone.js框架环境搭建及Hellow world示例(js框架怎么用)

下一篇JavaScript的Backbone.js框架入门学习指引(js back)