Backbone.js中的Events模块使用

本文先从项目组现有对Backbone.js中的Events模块的使用进行分析,然后列举了对Events模块的扩展使用。

Events哈希

Backbone的events哈希允许我们为el相关的自定义选择器或者直接为el本身(没有选择符的情况)提供事件监听器。事件采用的是‘evnetName selector’: ‘callbackFunction‘这样的形式,并且支持大量的事件类型,包括click、mouseover、dblclick、blur等,但还是有些事件类型是不支持的,例如:hover事件。

一个简单的例子:

  var  testView = Backbone.View.extend({
        events: {
            "click .tax-personnel-unmodify-btn": "shadeLayerHint",
            "click": "viewClickDeal",
            "blur input[name=personnelSerachKey]": "reQueryList",
            "keypress input[name=personnelSerachKey]": "personnelSerachKeyPress"
        }
    })

值得注意的是:上面的事件绑定仅限该view下面元素的事件的绑定,如果需要绑定不是该view下的节点的事件,可以使用jQuery的方式绑定。

更多运用

以上是项目组现在对Backbone事件的使用,当然通过查看官网的文档,看到Backbone事件,发现还有很多用途还未挖掘。下面的文章是对Backbone事件的更多应用。

运用1:实现model、view的双向绑定(目前项目组用的stickit实现)

var model = new Backbone.Model();
var view = new Backbone.View();

view.listenTo(model, ‘changeEvent‘, view.changeView);

view.changeView = function(){};

model.trigger("changeEvent");

运用2:实现观察者模式

利用Backbone的Events,可以很轻松的实现观察者模式,下面的例子有订阅、发布事件、取消订阅三种行为。

var observe = {};

_.extend(observe, Backbone.Events);
// 订阅
observe.on("say", hi);
observe.on("say", hello);

function hi(msg){
console.log("hi " + msg);
}

function hello(msg){
console.log("hello " + msg);
}
// 发布事件
observe.trigger("say", "Mr.Liu");
// 取消订阅
observe.off("say", hi);
observe.trigger("say", "Mr.Z");

小结:

整体说来Backbone的events模块还是很不错的,完全解决了我们绑定事件(jQuery方式)时dom节点是否纯在的问题(具体实现是利用观察者模式监听el的变化);哈希的形式来绑定事件,便于代码维护;还实现了一套观察者模式,我们只需拿过来用即可,避免了重复造轮子。

 

扩展:

有兴趣的朋友,可以看一下Events模块的实现,不是很复杂。

时间: 2024-11-07 05:21:36

Backbone.js中的Events模块使用的相关文章

Backbone.js 中使用 Model

前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js 中 Model 会涉及到很多的概念,如 Model 的初始化,默认值,属性的读写,属性值改变的监听,数据渲染,校验,以及与服务端的数据同步等. 本文不打算讲前面大部分的内容,最初思考的一个脉络是怎么把 Model 引入进来,所以线索会是 建立 Model 类 -> 初始化 Model 实例 ->

node.js中使用net模块创建服务器和客户端

1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require("net"); // 创建一个net.Server用来监听,当连接进来的时候,就会调用我们的函数 // client_sock,就是我们的与客户端通讯建立连接配对的socket // client_sock 就是与客户端通讯的net.Socket var server = net.createServer(function(client_soc

node.js 中的npm模块版本管理

semver npm 中的模块版本都需要遵循 semver 2.0 的语义化版本规则. 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的问题修正. 先行版本号及版本编译信息可以加到"主版本号.次版本号.修订号"的后面,作为延伸. 然后基于语义化的版本,我们在选择版本的时候就可以对依赖进行版本的控制: dependencies: { "express&quo

Node.js中的fs 模块

// file system 是node的文件处理模块 const fs = require('fs') const path = require('path') // 1. readFile 此函数用来异步读取文件,并在回调中可以获取读取文件结果 // 这个方法会将一个文件的全部内容都读到内存中,适合于体积小的文本,如果文件有数百MB大小,则建议使用stream let filePath = path.join(__dirname, 'test.txt') fs.readFile(filePa

Node.js权威指南 (12) - Node.js中的其他模块

12.1 使用dns模块解析域名 / 313 12.1.1 使用resolve方法将域名解析为DNS记录 / 313 12.1.2 使用lookup方法查询IP地址 / 315 12.1.3 使用reverse方法反向解析IP地址 / 316 12.1.4 dns模块中的各种错误代码 / 31712.2 使用punycode模块转换punycode编码 / 31812.3 使用os模块获取操作系统信息 / 32012.4 使用readline模块逐行读取流数据 / 323 12.4.1 创建 I

在node.js中使用mongose模块

对象与文档相对应 创建项目目录,用root进入 # mkdir /home/test/part9/ 直接# npm install mongoose,报错如下 ../node_modules/nan/nan.h:316:47: error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’ static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UT

Backbone?View中的events...click事件失效

<div id="container"> <input type="button" id="test_click" value="测试" /> </div> var View = Backbone.View.extend({ //el: '#container',//注释了就不可以了... template: _.template($("#item-template").

理解 Backbone.js中的bind和bindAll

http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html http://wenzhixin.net.cn/2013/11/01/understanding_bind_bindall http://chaoskeh.com/blog/use-underscore-bindall-carefully.html

使用Backbone.js, ExpressJS, node.js, MongoDB的web应用样板工程

这是web应用的一个完整的样板工程,用到了Backbone.js & Marionette, node.js & ExpressJS,MongoDB & Moogoose, Handlebars, Grunt.js, Bower和Browserify! 我建立了一个超级基础的单页面应用程序(SPA),就是一个简单的通讯录管理器, 但麻雀虽小,五脏俱全.我写这篇文章的目的是介绍一下这个应用所用到的整个技术栈:后端,数据,前端,工具和测试.主要包括下面这些技术: 后端: node.js