现在的位置: 首页 > 综合 > 正文

javascriptMVC入门 — 4.jQueryMX -> $.Controller

2012年08月20日 ⁄ 综合 ⁄ 共 3286字 ⁄ 字号 评论关闭

  $.Controller用于创建易管理的、节约内存的和执行效率高效的jquery插件。极强的灵活性允许他可以做为传统的view或者controller。你可以使用它创建tabs,grids和文本菜单,或者给他们灌输更为复杂的业务逻辑。Controller让你的代码功能更明确,可重复使用,更有组织性,他继承制$.Class,并且使用到了event delegation。

  基本的例子:

传统做法:

$(function(){
  $('#tabs').click(someCallbackFunction1)
  $('#tabs .tab').click(someCallbackFunction2)
  $('#tabs .delete click').click(someCallbackFunction3)
});

替代做法:

$.Controller('Tabs',{
  click: function() {...},
  '.tab click' : function() {...},
  '.delete click' : function() {...}
})
$('#tabs').tabs();

 

  使用Controller

  Controller帮助你创建和管理jquery插件,他可以用来创建简单的插件如slider,或者可以把多个插件组合成一个。理解Controller如何使用,你必须对传统的jquery插件的生命周期有清醒的认识,并且明白他们如何结合到Controller上的功能的。我们使用下面的方式定义一个Contrioller。

$.Controller("MyWidget",
{
  defaults :  {
    message : "Remove Me"
  }
},
{
  init : function(rawEl, rawOptions){ 
    this.element.append(
       "<div>"+this.options.message+"</div>"
      );
  },
  "div click" : function(div, ev){ 
    div.remove();
  }  
})

  上面的代码创建了一个名叫$.fn.my_widget的函数(关于Controller的创建和命名我会在下节课中讲解),可以用他在一个html元素上创建一个Controller的实例。使用方法如下:

$('.thing').my_widget(options)

  上面的代码实现了在所有'.thing' html元素上调用了new MyWidget(el, options)。当一个新Class实例创建的时候,Class原型方法setup和init方法将会被调用(上一章已经介绍了)。Controller的setup实现以下功能:

1.设置this.element,添加controller的名字到element的class属性上。

2.将传入的options选择项和默认的选择项合并,传给this.options。

3.将controller的引用保存到$.data。

4.绑定所有的事件处理函数。

  一般而言,Controller的事件处理会自动绑定的,不过有很多方式可以完成这一工作,我下文会介绍。当一个事件发生的时候,回调函数将会被执行,回调函数中的this会执行当前Controller的实例。这样会让使用帮助类变得简单,也更容易保存Controller的状态。

  当element从页面上移除的时候,Controller的destroy方法将会执行,在这里你可以方式和销毁相关的操作。当然你也可以直接调用销毁方法:

$('.thing').my_widget('destroy');

 

  Todos例子

  我们来看一个简单的例子,html代码如下:

<div id='todos'>
 <ol>
   <li class="todo">Laundry</li>
   <li class="todo">Dishes</li>
   <li class="todo">Walk Dog</li>
 </ol>
 <a class="create">Create</a>
</div>

Controller代码:

$.Controller('Todos',{
  ".todo mouseover" : function( el, ev ) {
    el.css("backgroundColor","red")
  },
  ".todo mouseout" : function( el, ev ) {
    el.css("backgroundColor","")
  },
  ".create click" : function() {
    this.find("ol").append("<li class='todo'>New Todo</li>"); 
  }
})

  现在Controller已经创建好了,接下来就是如何使用的问题了,有两个步骤需要做:首先创建Controller的实例,接下来在html元素上使用Controller实例。

//实现方式1
new Todos($('#todos'));
//实现方式2 $('#todos').todos();

 

  初始化Controller

  为你的插件添加一个init方法会相当有用。在下面的例子中,当controller被创建的时候,允许传一个message的参数作为html元素的内容。

$.Controller("SpecialController",
{
  init: function( el, message ) {
    this.element.html(message)
  }
})
$(".special").special("Hello World")

 

  移除Controller

  Controller使用的是jquery的remove方法,所以你可以通过移除html元素的方式实现controller的移除。

$(".special_controller").remove()

  如果你使用DOM的方法是没有办法销毁Controller的:

$("#containsControllers").html("")

  如果你只是想移除Controller上的功能,可以使用destroy函数:

$(".special_controller").controller().destroy()

 

  访问Controller

  经常你需要获得Controller的引用,有很多方式可以帮你实现。在下面的例子中,两个html元素的className都是'special':

//创建两个 foo controllers
$(".special").foo()

//创建两个 bar controllers
$(".special").bar()

//获得所有元素上的所有 controllers
$(".special").controllers() //-> [foo, bar, foo, bar]

//只获得 foo controllers
$(".special").controllers(FooController) //-> [foo, foo]

//获得所有 bar controllers
$(".special").controllers(BarController) //-> [bar, bar]

//获得第一个 controller
$(".special").controller() //-> foo

//通过data 获得 foo controller
$(".special").data("controllers")["FooController"] //-> foo

 

  调用Controller上的方法

  一旦你拥有了html元素的引用,你就可以调用它上面的方法。

//创建 foo controller
$(".special").foo({name: "value"})

//调用 FooController.prototype.update
$(".special").foo({name: "value2"})

//调用 FooController.prototype.bar
$(".special").foo("bar","something I want to pass")

抱歉!评论已关闭.