`

Backbone 不能事件响应 及 MVC 设计的注意事项

阅读更多

原文内容及更多精彩,在这里:http://yysource.sourceforge.net/?p=52

假设 html 内容为:

 

<div id="container">
</div>

而 template 内容为:

 

 

<script type='text/template' id='tpl'>
    <div class="myclass">
        事例内容
    </div>
</script>

在view视图中如下设置之后:

 

 

window.appView = Backbone.View.extend({
	template: _.template(jQuery("tpl").html()),
	events: {
		"click div": "onClick",
	},
	onClick: function (e) {
		alert(this);
	},
	initialize: function (pid) {
		this.parent = jQuery(jQuery("#"+pid)[0]);
		this.render();
	},
	render: function () {
		this.parent.html(""); // 先清空窗口内的其他内容
		this.parent.html(this.template());
	},
});

鼠标单击却不能触发onClick函数。后来通过跟踪 jQuery.on() 函数的执行,发现在内部传进去的 this 参数里,this.el.outerHTML 的值是 "<div></div>",即为默认 tag。因为 Backbone 中的事件响应,是根据 this.el.outerHTML 里的元素来设置的,那么在分配事件响应函数的时候,this.el.outerHTML 里没有元素,就意味着事件响应函数的失败!

 

所以正确的写法应该是:

 

window.appView = Backbone.View.extend({
	template: _.template(jQuery("tpl").html()),
	events: {
		"click div": "onClick",
	},
	onClick: function (e) {
		alert(this);
	},
	initialize: function (pid) {
		this.parent = jQuery(jQuery("#"+pid)[0]);
		this.render();
	},
	render: function () {
		this.$el.html(this.template()); // 将tpl中的内容写入到 this.el 元素中
		this.parent.html(""); // 先清空窗口内的其他内容
		this.parent.html(this.el);
		this.delegateEvents();		// 由于重绘了整个视图(this.$el.html(...);),所以保险的办法是重新绑定所有事件
		return this;		// 这里借鉴的是 Backbone 教程里 todo.js 的做法
	},
});

这样一来,this.el 里的内容就不再是 "<div></div>" 了,而是 '<div> <div class="myclass"> 事例内容 </div></div>' 了。这时再时行事件响应函数的分配时,就能在 this.el 里面找到一个div,并为之分配一个 onClick 函数了。

同时,由于在 render() 的开头,用 this.$el.html(this.template()); 重新绘制了整个视图,所以保险办法是调用 this.delegateEvents(); 重新绑定所有事件。

 

这里有一个问题,就是为什么不把 this.el 设置为 jQuery("#container"); 呢?其实一开始我也是这样做的,这样做的话 click 事件就可以很方便地响应到了,因为render() 之后 this.el 里肯定不只是 "<div></div>" 的。但是这样做的话,在视图 remove() 的时候就会出问题了。remove() 的效果是把 this.el 整个节点删除,也就是说,“<div id="container"></div>” 也会被删除!那么后来如果还有元素想在这个容器中写入的话,就会出错了!因为网页中已经没有了 id="container" 这个容器了!大家可以多看看 Backbone 官网上的 Todo 例子,个人觉得相当经典!网址如下:http://backbonejs.org/examples/todos/index.html


0
0
分享到:
评论

相关推荐

    讲解JavaScript的Backbone.js框架的MVC结构设计理念

    Backbone.js是基于JavaScript的一种前端MVC框架,它的设计理念遵循了传统的模型-视图-控制器(Model-View-Controller)结构。相较于Angular.js等其他前端框架,Backbone.js显得更加轻巧,它专注于提供一组基础的工具...

    JS MVC框架(BackBone)

    BackBone.js 是一个轻量级的JavaScript库,它引入了MVC(模型-视图-控制器)设计模式,为Web应用开发提供了结构化的组织方式。BackBone的主要目标是使JavaScript代码更加有序,便于维护和扩展。在这个框架中,我们...

    react-backbone, Backbone 感知mixin用于响应和更多.zip

    react-backbone, Backbone 感知mixin用于响应和更多 反应中枢为 Backbone 提供对你的的响应,以响应你的组件,。将 backbone/backbone 。集合感知awareness你的反应组件mixin用于更新模型更改事件,请注意xhr活动和...

    web前端框架MVC(backBone)实现记账应用,后端使用node.js(版本: lpNote-1.0)

    Backbone.js是一款轻量级的JavaScript库,它遵循MVC(Model-View-Controller)设计模式,用于构建结构化的前端应用。在MVC架构中: 1. **Model**:代表数据模型,负责存储和处理业务逻辑,与服务器进行数据交换。 2...

    Backbone.js的事件绑定

    Backbone.js是一个轻量级的JavaScript库,专为构建可维护和模块化的Web应用而设计。它基于MVC(Model-View-Controller)模式,帮助开发者组织和管理前端代码结构,使得复杂的应用程序更容易理解和扩展。在“Backbone...

    aps.net mvc 5 Backbone Demo

    ASP.NET MVC 5 和 Backbone.js 是两种非常流行的Web开发技术,它们在构建高效、可维护的Web应用程序方面各自发挥着独特的作用。在这个"aps.net mvc 5 Backbone Demo"项目中,开发者使用了这两个框架来实现一个用户...

    BackBone介绍及使用

    Backbone推崇的是“胖模型,瘦视图”,视图不直接操作数据,而是通过事件驱动来更新模型。 4. **Router**:路由器是Backbone实现单页面应用(SPA)的关键。它监听浏览器的哈希变化(#),并根据路由规则调用相应的...

    typescript例子-Backbone.js MVC

    Backbone.js是一个轻量级的JavaScript库,它引入了MVC(Model-View-Controller)模式,帮助开发者更好地组织前端代码结构,提供模型管理、视图渲染和事件处理等功能。将TypeScript与Backbone.js结合,可以利用...

    Asp.net MVC + Backbone + React DEMO

    这是一个基于Asp.net MVC框架,结合Backbone.js和React.js技术构建的DEMO项目,旨在提供一个学习和参考的实例。让我们深入探讨一下这个项目中涉及的关键知识点。 首先,Asp.net MVC是一种广泛使用的Web应用开发框架...

    backbone 和bootstrap 登录示例项目

    Backbone.js的核心特性包括事件驱动的设计、RESTful接口支持以及对视图的灵活处理,使开发者能更有序地组织前端代码。 Bootstrap则是Twitter开源的一个用于快速开发响应式和移动优先Web应用的前端框架。它提供了...

    backbone 资料

    然而,Backbone并不包含任何UI组件,这意味着你需要自己设计和实现视图。这也是为什么有些开发者会选择Bootstrap、React或Vue等库来补充Backbone,构建更完整的前端解决方案。 文件"oer-backbone"可能包含了关于...

    Backbone.js开发秘笈源码

    通过仔细研究这些源码,开发者不仅可以掌握Backbone.js的基本用法,还能学习到如何设计和实现一个模块化、可扩展的前端应用。同时,这也有助于理解MVC架构在JavaScript中的应用,以及如何利用事件驱动编程和数据绑定...

    深入解析JavaScript框架Backbone.js中的事件机制

    Backbone.js是一个轻量级的JavaScript框架,它采用了MVC(Model-View-Controller)设计模式,以帮助开发者更好地组织代码。在这个框架中,事件机制是实现组件间通信的关键部分,使得不同对象能够互相协作而无需紧密...

    (backbone+requirejs+bootstrap)前台(spring mvc+spring+mybatis)后台登录注册

    在登录注册页面中,Bootstrap 提供了预设的表单元素、按钮、网格系统等,使得开发者能快速构建出美观且响应式的界面。 后端部分: 1. **Spring MVC**:Spring MVC 是Spring框架的一部分,主要用于构建Web应用的...

    backbone官方实例

    Backbone.js是一款轻量级的JavaScript库,专为构建可维护的前端应用而设计。它提供了模型(Model)、视图(View)、集合(Collection)和路由器(Router)等核心概念,帮助开发者实现MVC(Model-View-Controller)架构。在这...

    Backbone.js(1.1.2) API中文文档.zip Backbone.js离线文档

    Backbone.js是一款轻量级的JavaScript库,专为构建丰富的Web应用程序而设计。它通过提供模型(Models)、视图(Views)、集合(Collections)和路由器(Routers)等核心概念,帮助开发者组织代码并实现MVC(Model-...

    基于bootstrap样式和backbone的常用UI封装

    不过,要注意的是,虽然Backbone Bootstrap项目可能是学习和实践这种结合的好方法,但本描述中提到的"小Demo,不要下载"可能提示这是一个示例,不适合在生产环境中直接使用。 总之,Bootstrap和Backbone.js的结合为...

Global site tag (gtag.js) - Google Analytics