`

JavaScriptMVC之控制器监听事件

 
阅读更多

控制器安装和卸载事件句柄非常容易。卸载事件句柄对于防止内存泄漏非常重要。

自动绑定

当一个新的控制器创建后,控制器原型方法那些是事件句柄。它会把使用控制器的事件委托功能把这些函数绑定控制器上。 当这个控制器销毁(或者对应的元素从页面上删除),控制器将自动卸载它的事件句柄。 例如:以下控制器的每个函数将自动绑定:

 

$.Controller("Crazy",{

  // listens to all clicks on this element
  "click" : function(el, ev){},

  // listens to all mouseovers on 
  // li elements withing this controller
  "li mouseover" : function(el, ev){}

  // listens to the window being resized
  "{window} resize" : function(window, ev){}
}) 

控制器通过函数名加空间,标准的DOM事件名,Jquery专用事件名(请查看$.event.special)。

一般而言,除了没有选择器和事件不在Jquery专用事件内,控制器都会知道自动绑定事件句柄。

如果遇到上面的情况,你就需要添加这个函数名到控制器的静态listensTo属性里。 例如:

 $.Controller("MyShow",{
   listensTo: ["show"]
 },{
   show: function( el, ev ) {
     el.show();
   }
 })
 $('.show').my_show().trigger("show"); 

 回调函数的传递参数

事件句柄绑定是控制器在元素上回调且把事件当成参数传递过来。this引用指的是控制器实例。例如:

 

$.Controller("Tabs",{

  // li - the list element that was clicked
  // ev - the click event
  "li click" : function(li, ev){
     this.tab(li).hide()
  },
  tab : function(li){
    return $(li.find("a").attr("href"))
  }
}) 

 模板匹配事件绑定

模板匹配事件句柄是控制器一个非常强大的特性。你可以把事件名,选择器,或者事件的根元素参数化。 模板匹配事件名称和选择器 常常,你想要创建一个配件行为配置。一个通俗的例子是菜单显示子菜单事件(例如:点击或者鼠标进入)。 以下控制器让你配置当一个菜单想显示子菜单时的事件。 以下创建2个按钮。

 

$.Controller("Menu",{
  "li {showEvent}" : function(el){
    el.children('ul').show()
  }
})

$("#clickMe").menu({showEvent : "click"});
$("#touchMe").menu({showEvent : "mouseenter"});

 $.Controller使用双括号来替换控制器中的options对应的值。这就意味着我们可以很容易实现一个默认的showEvent值来代替上面的作法, 而且创建菜单时,不需要再提供一个值了。例如:

 

$.Controller("Menu",
{
  defaults : {
    showEvent : "click"
  }
},
{
  "li {showEvent}" : function(el){
    el.children('ul').show()
  }
});

$("#clickMe").menu(); //defaults to using click

 有时,我们可能想去配置我们的配件去使用不同的元素。下面是把菜单子菜单显示事件绑定到按钮上。

$.Controller("Menu",{
  "{button} {showEvent}" : function(el){
    el.children('ul').show()
  }
})

$('#buttonMenu').menu({button: "button"});

 模板匹配根元素

最后,控制器的事件句柄绑定到控制器元素外的对象上。 以下是监听窗口的点击事件:

$.Controller("HideOnClick",{
  "{window} click" : function(){
    this.element.hide()
  }
})

如下是监听Todos的创建事件:

$.Controller("NewTodos",{
  "{App.Models.Todo} created" : function(Todo, ev, newTodo){
    this.element.append("newTodos.ejs", newTodo)
  }
});

 但是上面代码只能监听Todo Model的新建Todos的动作。我们也可以把它修改为可配置的:

$.Controller("Newbie",{
  "{model} created" : function(Model, ev, newItem){
    this.element.append(this.options.view, newItem)
  }
});

$('#newItems').newbie({
  model: App.Models.Todo,
  view: "newTodos.ejs"
}) 

 那么模板匹配到底是如何实现的呢?

当查找一个值去替换双括号,控制器首先想找在options中的项,如果没有查找到,再去Window对象中查找。这里不是使用eval去查找对象。 代替它的是使用了jQuery.String.getObject,详细请看语言助手(Language helpers)下的$.String.getObject,在这里不详细介绍。

 

预订OpenAjax信息和自定义绑定

使用jquery/controller/subscribe插件允许控制器监听OpenAjax.hub信息。 其实这个功能很像我们Java中的订阅模式,我们只需要预订对应事件,当事件发生时,会通知所有的订阅者。 例如:

steal('jquery/controller/subscribe').then(function(){
	//这个控制器既是订阅者,又是发布者
    $.Controller('subscribeTest',{
        onDocument: false
    },
    {
        "#subscribe1 click": function(el, ev){
            ev.stopPropagation();
			//点击按钮,向所有订阅者发布
            this.publish("oaSubscribe1", {"params":"Hola Mundo"});		
        },
		//订阅者收到发布的处理函数
        "oaSubscribe1 subscribe": function(called, data){
            alert("subscribeTest " + data.params + " : " + this.Class.shortName);
        }
    });
    
	//这个控制器只是订阅者
	$.Controller('subscribeTest1',{
        onDocument: false
    },
    {	
		//订阅者2收到发布的处理函数
        "oaSubscribe1 subscribe": function(called, data){
            alert("subscribeTest1 " + data.params + " : " + this.Class.shortName);
        }
    });
	
    var subscribeController = new subscribeTest($("#testSubscribe")[0]);
    var subscribeController1 = new subscribeTest1($("#subscribe2"));
    $("#off").bind("click",function(){
       subscribeController.destroy(); 
	   subscribeController1.destroy(); 
    })
});

 

 手动绑定事件

控制器的原型bind和delegate方法都让监听其它元素的事件。这些事件句柄将在控制器实例销毁后去绑定。

 

1
0
分享到:
评论

相关推荐

    JavaScriptMVC之实战

    NULL 博文链接:https://lyndon-lin.iteye.com/blog/1556095

    javascriptmvc-3.2.4.zip

    在JavaScriptMVC中,控制器处理DOM事件,确保应用响应用户的交互。 JavaScriptMVC 3.2.4版本可能包含以下组件: - **jQueryMX**:扩展了jQuery库,提供更强大的选择器、遍历和操作DOM的功能,以及对MVC模式的支持...

    javascriptmvc3.0.5

    上传了一半的javascriptmvc3.0.5,这个是【下】

    从JavaScriptMVC开始如何完成项目之创建应用程序

    5. **实现控制器**:编写控制器函数或类,处理用户事件,调用模型方法,并通知视图进行更新。 6. **路由(Routing)**:如果应用有多个页面或视图,需要设置路由来管理导航。路由根据URL映射到不同的视图或控制器。...

    javascriptmvc-3.3.zip

    3.3版可能增强了控制器的响应能力和事件处理机制,提高了用户体验。 6. **View**: 视图负责展示数据,通常使用模板语言生成HTML。在JavaScriptMVC 3.3中,视图可能优化了模板引擎,支持更复杂的逻辑和更高效的渲染...

    MVC框架 JavaScriptMVC.zip

    JavaScriptMVC附带了一个命令行工具,用于生成项目结构、模型、控制器、视图等。这极大地提高了开发效率,确保了代码的规范性。 **测试支持** JavaScriptMVC框架内置了测试框架,如JSUnit和Jasmine,便于开发者编写...

    javascriptmvc

    控制器确保数据流向的单向性,避免了直接在视图和模型之间建立双向绑定,从而降低复杂性。 **JavaScript MVC框架** 一些知名的JavaScript MVC框架包括AngularJS、Backbone.js、Ember.js和Vue.js等。这些框架提供了...

    javaScriptMVC 开源框架 第一部分

    JavaScriptMVC的构建离不开jQuery,一个广泛使用的JavaScript库,简化了DOM操作、事件处理、动画和Ajax交互。jQuery的使用使得JavaScriptMVC能够快速、高效地操作页面元素,提高了开发效率。 **核心组件** ...

    从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档

    这个框架提供了一整套工具,包括代码管理、路由、模型、视图、控制器等,以支持大型和复杂的Web应用。在“从JavaScriptMVC开始如何完成项目之压缩文件和生成帮助文档”这个主题中,我们将探讨如何利用该框架进行项目...

    谈谈JavaScriptMVC模式共3页.pdf.zip

    控制器是Model和View之间的桥梁,处理用户输入并协调两者之间的交互。在JavaScript MVC中,Controller监听View的事件,如用户点击按钮,然后调用Model的方法来更新数据。同时,Controller也会响应Model的变化,更新...

    javaScriptMVC 开源框架 第三部分(相关资料和例子)

    3. **框架的使用**:文档可能提供如何初始化框架、创建模型、定义视图和控制器的步骤,以及如何进行数据绑定和事件处理。 4. **最佳实践**:可能涵盖编写可维护的JavaScript MVC代码的技巧,如模块化、依赖注入、...

    javascriptmvc-3.0.5最新包

    javascriptmvc3.0.5,文件大于20MB,分成两个卷

    JavaScriptMVC:JavaSriptMVC 高级编程课程

    在JavaScriptMVC中,模型处理数据和业务逻辑,视图负责展示数据,而控制器则协调模型和视图之间的交互。 2. **jQuery和JavaScriptMVC的关系** JavaScriptMVC基于jQuery库,利用jQuery的强大DOM操作和事件处理能力...

    JavascriptMVC代码

    例如,在AngularJS中,控制器是通过`ng-controller`指令定义的,可以注入服务并处理用户的操作。 4. **Router**:在大型应用中,路由管理是非常关键的,它负责根据URL来加载相应的视图和控制器。例如,Ember.js和...

    javaScriptMVC 开源框架 第二部分

    首先,MVC模式是软件工程中的一个经典设计模式,它将应用分为三个主要部分:Model(模型)负责处理数据和业务逻辑,View(视图)负责展示数据,而Controller(控制器)作为两者之间的桥梁,处理用户交互并更新模型或...

    JavaScriptMVC框架Mithril.zip

    可将应用分成数据层、UI层和控制层。Mithril 压缩后只有 3kb 左右。API 提供一个模板引擎,带 DOM diff 实现,支持路由和组合。 示例代码: //namespace var app = {}; //model app.PageList = ...

    JavaScriptMVC 测试框架 v2.2

    内容索引:脚本资源,Ajax/JavaScript,JavaScriptMVC JavaScriptMVC 是一个功能强大的 JavaScript framework....JavaScriptMVC应用了模型-视图-控制器架构模式,把业务逻辑和表示分离,使得代码更加模块化。

    前端MVC的应用.pdf

    前端MVC是指在前端开发中应用Model-View-Controller(模型-视图-控制器)架构模式的设计思想。这种架构模式来自于传统的后端开发领域,但是在前端开发中也同样适用。下面我们来详细介绍前端MVC的应用。 模型(Model...

    JavaScriptMVC框架PK:Angular、Backbone、CanJS与Ember

    :选择JavaScriptMVC框架很难。一方面要考虑的因素非常多,另一方面这种框架也非常多,而要从中选择一个合适的,还真得费一番心思。本文对JavaScriptMVC框架Angular、Backbone、CanJS和Ember作了比较,供大家参考。...

Global site tag (gtag.js) - Google Analytics