导语

将状态保存在客户端可以加快页面反映;但应当避免状态或数据保存在DOM中;在MVC中,状态应该保存在控制器中

控制器是视图和模型的纽带,只有控制器知道视图和模型的存在并将它们连接在一起;当加载页面时,控制器将事件处理程序绑定在视图里,并适时地处理回调,以及和模型必要地对接

模块模式

用来封装逻辑并避免全局命名空间污染,一般使用匿名函数实现

(function() {
/**/
})();

全局导入

利用参数地方式

(function($) {
/**/
})(jQuery)

全局导出

(function($, exports) {
exports.Foo = "wen";
/**/
})(jQuery, window);

添加少量上下文

模版中地上下文是全局;想自定义作用域上下文需要将使用对象方法

(function ($) {
var mod = {};
mod.load = function(func) {
$($.proxy(func, this));
};
mod.load(function() {
this.view = $("#view");
});
mod.assetsClick = function(e) {
/**/
};
mod.load(function() {
this.view.find(".assets").click(
$.proxy(this.assetsClick, this)
);
})
})(jQuery)

控制器内所有地状态都是局部封装在模块里

抽象出库

(function ($, exports) {
var mod = function(includes) {
if(includes) this.include(includes);
}
mod.fn = mod.prototype;
//保证函数在局部上下文中执行
mod.fn.proxy = function(func) {
return $.proxy(func, this);
};
mod.fn.load = function(func) {
$(this.proxy(func));
};
//给控制器添加属性
mod.fn.include = function(ob) {
$.extend(this, ob);
};
exports.Controller = mod;
})(jQuery, window); (function($, Controller) {
var mod = new Controller;
mod.toggleClass = function(e) {
this.view.toggleClass("over", e.data);
};
mod.load(function() {
this.view = $("#view");
this.view.mouseover(this.proxy(this.toggleClass));
this.view.mouseout(this.proxy(this.toggleClass));
});
})(jQuery, Controller);

扩充控制器

//给每个实例子添加属性/方法
Controller.fn.click = function(func) {
$("#view").bind("click", this.proxy(func));
}
//使用
var mod = new Controller;
mod.click(function(){/**/}); //或者从其他控制器复制方法过来
(function ($, exports) {
var StateMachine = function(){};
StateMachine.fn = StateMachine.prototype; StateMachine.fn.add = function(controller){
/**/
};
exports.StateMachine = StateMachine;
})(jQuery, window); var mod = new Controller;
mod.include(StateMachine);

文档加载完之后载入控制器

目前,控制器地一部分在生成DOM之前就载入里,另一部分则在页面文档载入完成后触发地回调里;解决地方法是统一在DOM生成后载入控制器

var exports = this;
(function($) {
var mod = {};
mod.create = function(includes) {
var result = function() {
this.init.apply(this, arguments);
};
result.fn = result.prototype;
result.fn.init = function() {};
result.proxy = function(func) {
return $.proxy(func, this);
}
result.fn.proxy = result.proxy;
result.include = function(ob) {
$.extend(this.fn, ob);
}
result.extend = function(ob) {
$.extend(this, ob);
};
if(includes) result.include(includes);
return result;
};
exports.Controller = mod;
})(jQuery);
//使用jQuery.ready()
jQuery(function($) {
var ToggleView = Controller.create({
init: function(view) {
this.view = $(view);
this.view.mouseover(this.proxy(this.toggleClass));
this.view.mouseout(this.proxy(this.toggleClass));
},
toggleClass: function(e) {
this.view.toggleClass("over", e.data);
}
});
//实例化
new ToggleView("#view");
});

mvc-4控制器和状态(1)的更多相关文章

  1. Javascript MVC 学习笔记(二) 控制器和状态

    今天进入第二个部分:控制器. 控制器和状态 从以往的开发经验来看.我们都是将状态保存在server的session或者本地cookie中,但Javascript应用往往被限制在单页面,所以我们也能够将 ...

  2. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  3. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  4. mvc-4控制器和状态(2)

    访问视图 常见地视图模式时一个视图对应一个控制器,视图包含一个id,通过id传入控制器:在视图之中的元素则使用class 这里会使用jquery的选择器,为了减少使用,可以设置一个专门用于存放选择器到 ...

  5. MVC 在控制器中获取某个视图动态的HTML代码

    ASP.NET MVC 在控制器中获取某个视图动态的HTML代码   如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...

  6. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  7. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  8. [转]ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  9. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  10. ASP.NET MVC系列:控制器的Edit方法

    在前面我们已经介绍了如何创建控制器.视图和数据模型,运行之前的项目并打开Movies主页,将鼠标悬停在“编辑”菜单上,你会看到浏览器右下角显示了“编辑”链接的地址

随机推荐

  1. JavaScript 最佳实践

    这个文档是基于JavaScript社区众多开发者的意见和经验,在开发JavaScript代码上的最佳实践和首选的方案的明细表.因为这是一个推荐的表而非原则性的方案,经验丰富的开发者可能对下面的表达会有 ...

  2. Memcached的配置和使用

    1.下载windows版本,64位下载地址: http://s3.amazonaws.com/downloads.northscale.com/memcached-win64-1.4.4-14.zip ...

  3. Iphone和iPad适配, 横竖屏

    竖屏情况下: [UIScreen mainScreen].bounds.size.width = 320 [UIScreen mainScreen].bounds.size.width = 568 横 ...

  4. Linux文件权限管理(持续更新)

    文章是从我的个人博客上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 以root身份登录linux以后, ls -al 可以看到 -rw-rw-r--  1 wangzhe ...

  5. [BZOJ1064][Noi2008]假面舞会

    [BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...

  6. C#装箱和拆箱(值类型和引用类型之间的转换)

    面向对象编程中,封箱指把非对象类型的数值或数据,包装成对象类型反之,拆箱指把对象类型拆成非对象的数值或数据. 例子:定义一个Circle 类 class Circle { double radius; ...

  7. Python 正则表达式_re模块_使用compile加速

    使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用. 第一个参数是规则式,第二个参数是规则选项. 返回一个Pattern对象 ...

  8. HDOJ 1690

    Bus System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. GraphicsMagick为图片添加水印

    GraphicsMagick号称图像处理领域的瑞士军刀.提供了健壮及高效的图像处理工具包和库,支持超过88种主流图片格式包括:BMP,GIF,JPEG,JPEG-2000,PNG,PDF,PNM,TI ...

  10. 使用ifconfig命令给网卡配置ip别名

    给网卡eth0配置一个ip别名 sudo ifconfig eth0:0 10.108.125.6/22 up 若想保存该配置,以便每次开机都可以使用该ip别名,则应 sudo vim /etc/ne ...