Home - Julienedies/brick GitHub Wiki
Welcome to the brick wiki!
brick是一个轻量级前端开发框架,基于jQuery(或zepto)和underscore。主要用于提升前端页面开发效率及复杂功能页面js代码的组织性和维护性。 其设计及实现主要借鉴并且反映了angular的前端开发思想及解决方案。
其主要思想包含两点:
因为前端开发通常同时涉及html、css、js,通过对代码类型进行划分,以提高代码复用性及维护性。通常分为以下几种类型的代码:
- controller(控制器)类型代码,主要用于衔接dom操作及service调用:
- service(服务)类型代码:主要用于封装纯js操作类型代码,会比较接近于mvc里m的概念。复用程度高;
- directive(指令)类型代码,通过自定义dom属性的方式为所属dom元素绑定行为。主要用于封装操作dom的代码,譬如一个典型的标签页功能。复用程度高;
虽然已经存在众多的UI组件,但是其使用便捷性及移植性并不好。 譬如虽然jQuery提供了jQuery UI,但实际项目开发中,很少有人会直接使用jQuery UI的样式,很多时间精力花费在样式的修改上。 考虑到这点,通过指令的形式提供基本的js行为,用户可以随意定义模板及样式;
https://julienedies.github.io/brick/public/example/todo/index.html
服务通常是一个单例对象。用于封装特定的功能。例如对一个数据模型的增删改查。mvc里的v通常可以作为一个service存在。但service并不仅仅限于v。
使用brick.services.reg
方法注册service。一个service被注册之后,就可以通过依赖注入的方式,在声明对其依赖的控制器或其它服务中被使用。例如以下代码定义了一个名为stocksModel的服务:
brick.services.reg('stocksModel', function(){
return {
get: function(id){
/* 从服务器获取股票列表模型*/
return [];
}
};
});
控制器本质就是一个函数。作用的话比较像mvc里的c。定义一个控制器的同时,也即声明了一个作用域对象。该作用域对象在控制器初始化时作为实参被注入,对应于形参scope。使用brick.controllers.reg
方法定义并注册一个控制器。控制器的定义需要必须的两个参数,控制器id,控制器Factory function,可选的控制器配置。例如:
brick.controllers.reg('demoCtrl',function(scope, stocksModel){
console.log(this === scope) // true
console.log(stocksModel === brick.services.get('stocksModel')) // true
scope.name = 'me';
scope.getTimestamp = function(){return +new Date};
},{depend:['stocksModel']});
以上的代码定义了一个id为demoCtrl的控制器,可选的第三个参数声明了该控制器依赖的服务。声明的依赖服务会在控制器初始化时,紧接着scope作为实参被传入。通过为scope实例添加属性的方式,提供对外可用的方法和属性。
指令通常是操作dom的代码。通过自定义html属性的方式声明和绑定。
其实html元素中有很多属性都可以理解成一个指令。譬如一个文本输入框的maxlength属性可以定义最大输入字符长度;有title属性的元素会在鼠标滑入的时候显示title属性包含的字符串;一个有href属性的链接被点击之后进入到href属性指向的新页面,这些统统可以理解为指令。只不过这些指令对应的行为是由浏览器实现的。
在brick中,通过自定义属性声明的方式应用一个指令。譬如以下代码通过定义ic-pagination属性应用了ic-pagination指令,该指令定义了一个分页控件:
<div class="pagination"
ic-pagination="companies"
ic-pagination-rows="30"
ic-pagination-total="32"
ic-pagination-step="10" >
<span class="prev" ic-role-pagination-prev><</span>
<span class="ellipsis" ic-role-pagination-ellipsis>...</span>
<span class="num" ic-role-pagination-num="{{}}">{{}}</span>
<span class="next" ic-role-pagination-next>></span>
</div>