Javascript Web应用开发之-MVC模式
这并不是说MVC 不允许包含视觉呈现相关的逻辑,只要这部分逻辑没有定义在视图之内即可。我们将视觉呈现逻辑归类为“视图助手”(helper):和视图有关的独立的小型工具函数。
来看下面的例子,其在视图中包含了逻辑,这是一个反例,平时不应当这样做:
// template.html
${ formatDate(this.date) }
在这段代码中,我们把formatDate() 函数直接插入视图中,这违反了MVC 的原则,结果导致标签看上去像大杂烩一样不可维护。可以将视觉呈现逻辑剥离出来放入视图助手中,正如下面的代码就避免了这个问题,可以让这个应用的结构满足MVC。
// helper.js
var helper = {};
helper.formatDate = function(){ /* ... */ };
// template.html
${ helper.formatDate(this.date) }
此外,所有视觉呈现逻辑都包含在helper 变量中,这是一个命名空间,可以防止冲突并保持代码清晰、可扩展。
不要太在意视图和模板的细节,我们会在第5 章中有详细讲述。本小节的目的只是简单介绍视图和MVC 架构模式之间的联系。
控制器
控制器是模型和视图之间的纽带。控制器从视图获得事件和输入,对它们(很可能包含模型)进行处理,并相应地更新视图。当页面加载时,控制器会给视图添加事件监听,比如监听表单提交或按钮点击。然后,当用户和你的应用产生交互时,控制器中的事件触发器就开始工作了。
不用使用类库和框架也能实现控制器,下面这个例子就是使用简单的jQuery 代码来实现的:
var Controller = {};
// 使用匿名函数来封装一个作用域
(Controller.users = function($){
var nameClick = function(){
/* ... */
};
// 在页面加载时绑定事件监听
$(function(){
$("#view .name").click(nameClick);
});
})(jQuery);
我们创建了users 控制器,这个控制器是放在Controller 变量下的命名空间。然后,我们使用了一个匿名函数封装了一个作用域,以避免对全局作用域造成污染。当页面加载时,程序给视图元素绑定了click 事件的监听。