js类如何自动加载组件

当前端js代码越来越多越来越复杂时,按逻辑分层就会变得势在必行,否则代码会逐渐变乱,维护成本就会越来越高。之前曾做个一个复杂的模块,大部分逻辑都是在前端实现的,其中有一个两千多行的js文件,ajax数据访问、业务逻辑、html生成全都搅在一起…..每次改动都是一场噩梦…..往事不堪回首呀

扯远了,当对代码分层后,各层之间的互相调用也会是一个问题,本文介绍的方法,仿照cakephp的方式,提供了一种为controller层自动添加component组件的思路

首先,是Controller的抽象类,供所有的Controller继承,它的主要功能是为controller的实现类添加它们所需要的component等组件

controller = {};
controller.AbstractController = function(){
	function AbstractController(){
		if(this.components.length > 0){
			for(var i = 0; i < this.components.length; i++){
				var compName = this.components[i];
				if(component[compName]){
					this[compName] = new component[compName]();
				}
			}
		}
	}
	return AbstractController;
}();

下面视一个controller的一个实现,通过this.components定义自己需要加载的component,然后通过call方式继承AbstractController,让AbstractController完成component的加载。然后在下面的方法中,通过this.xxxComponent的方式调用该component

controller.ListController = function(){
	function ListController(){
		this.components = ['newsComponent'];
		controller.AbstractController.call(this);
	}
	ListController.prototype = {
		listNews : function(){
			var news = this.newsComponent.getNewsList();
			//TODO:...
		}
	}
 
	return ListController;
}();

newsComponent

component = {};
component.newsComponent = function(){
	function NewsComponent(){
 
	}
	NewsComponent.prototype = {
		getNewsList : function(){
			alert('call function : newsComponent.getNewsList()');
		}
	}
	return NewsComponent;
}();

测试

var listCont = new controller.ListController();
listCont.listNews();//alert

另外,对于比较大的前端应用,可以构造一个组件池,在实例化一个component后,将其放到组件池内,下次其它controller再要使用这个component时,直接从组件池中拿出来用就行了,可以省去很多资源

One comment

  • Amy
    2011 年 09 月 01 日 - 上午 1:52 | Permalink

    完全看不懂的人漂过~

  • 发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注

    *

    *