译者声明:

  1、代码库发布在http://pablovallejo.github.io/gillie/

  2、查看API介绍直接戳这里看整理。

Gillie是一个轻型MVC框架,受Backbone的启发实现。它提供了一些方法,可以实现RESTful HTTP请求,同时允许使用models,views和handlers来分离功能点。另外提供了事件API,从而views可以监听模型事件并采取适当行为,最终以这种方式实现了监听者设计模式。

获取代码

开发者版本 16 k

应用版本 4 K

CDN版本:

  <script src="//cdnjs.cloudflare.com/ajax/libs/gillie/0.2.1/gillie.min.js"></script>

历史沿革:

作者曾在某具有大型代码库的javascript项目中工作,在了解backbone之后决定创建这个小型库来实现backbone的一些特性及其架构。最终我们将足够的功能添加到这个库里。

译者:这个库提供了Mvvm框架下的基本功能,同时因其体积和灵活性,可以很好的适配到手机端

构建app

Gillie 遵循MVC设计,其中控制器(controller)称为处理器(handler)。处理器是用于监听DOM事件,获取数据,并且将数据传递给模型存储。一旦模型完成了存储数据的行为,将触发一个事件,通常是与监听模型的视图(view)有关,从而重绘DOM

小知识:repaint /  reflow

理念:

Gillie目的是使开发者更简单的使用javascript开发模式,理解基本的MV*(MVVM,MVC)模型,从而更易于使用其他类似于backbone,angularJS,emberJS之类的框架。

小知识: MVVM : 英文原版 (中文翻译

示例一:hello world!

定义处理器:

var MainHandler = Gillie.Handler.extend({

    initialize: function() {
alert( 'Hello world!' );
} }); //创建handler实例
var mainHandler = new MainHandler();

定义dom处理器:

var AppHandler = Gillie.Handler.extend({

        events: {
'click a': 'turnRed'
} , turnRed: function( e ) {
e.preventDefault(); var target = e.currentTarget;
$( target ).css( 'color', 'red' ); }
}); // 创建处理器实例
var appHandler = new AppHandler();

示例二:todo 应用(在服务器保存数据)

模型(model)定义

当post请求完成后,将会触发模型中的事件,将实例和服务器响应返回给监听者

var TodoModel = Gillie.Model.extend({

        url: 'http://localhost/api/'

    ,   create: function( event ) {
this.Post( 'todo/', event );
} }); // 创建模型实例
var todoModel = new TodoModel();

视图(View)定义

var TodoView = Gillie.View.extend({

        initialize: function() {

            // 绑定’todo.create’事件
todoModel.on( 'todo.create', this.onCreate );
} , onCreate: function( instance, response ) {
alert( instance.get( 'title' ) + '. Has been saved' );
} }); // 创建视图实例
var todoView = new TodoView();

处理器(Handler)定义

var TodoHandler = Gillie.Handler.extend({

        events: {
'keypress #new-todo': 'createOnEnter'
} , createOnEnter: function( e ) { var enterKey = 13
, currentTarget = e.currentTarget; if ( e.which != enterKey ) return; var title = $( target ).val();
todoModel.set( 'title', title )
.create( 'todo.create' ); }
}); // 创建处理器实例
var todoHandler = new TodoHandler();

使用方式

包含脚本时,模型定义在先,视图和处理器定义在后。这样视图和处理器可以使用模型。

<script src="js/jquery.js"></script>
<script src="js/gillie.js"></script>
<script src="js/yourapp.js"></script>

正确示例:

<script src="js/models/post.js"></script>
<!-- 视图会需要访问模型,并且监听它的事件 -->
<script src="js/views/post.js"></script>
<!— 模型定义在先,从而处理器可以创建模型 -->
<script src="js/handler/post.js"></script>

错误示例:

<!— 处理器定义无法访问post模型 -->
<script src="js/handler/post.js"></script>
<!— 由于未定义模型,使得视图无法监听post模型-->
<script src="js/views/post.js"></script>
<!— 虽然在视图及处理器之后加入模型,但前者已经无法访问模型了-->
<script src="js/models/post.js"></script>

处理器(Handler)API参考

Handlers属于应用程序,关注DOM事件监听,例如点击,提交表单,按键弹起,以及类似的动作,进而获取到他们的数据,传递给模型来存储到数据库中,并通知视图改动事件。

initialize: function()

//初始化API:初始化处理器,在模型和视图中有类似的方法,每次实例创建时均被调用
//使用方法:
var Posts = Gillie.Handler.extend({ initialize: function() { // 从所有的posts中获取信息并触发’posts.get’事件
// 监听者获知事件,从而重新渲染
model.sync( 'posts.get' );
}
});
// Posts 实例
var posts = new Post();

Element  el: string

//el属性值为定义事件的容器,当指定该值到.post-box时,所有在事件属性中定义的事件,都将仅绑定到.post-box的内部元素
//如果el没有指定,事件将绑定到document上
//使用方法
var Posts = Gillie.Handler.extend({ // 绑定容器
el: '.posts-container' , events: {
'click .post-title': 'showPost'
} // Show post 方法
, showPost: function( e ) {
e.preventDefault(); //做点什么吧...
} }); // 创建实例,启动监听
var posts = new Posts();

Events events: {}

//Events值为对象类型,用于绑定dom事件,并且将其部署到处理器回调方法中
//在回调中,上下文环境为处理器自身。也就是说,处理器中定义的方法可以在处理器其他方法的事件回调中调用。
//使用方法
var Posts = Gillie.Handler.extend({ events: {
'click .post-title': 'showPost'
, 'submit .update-post': 'updatePost'
, 'keyup .posts-search-field': 'findPosts'
} , showPost: function( e ) { // 例如此处,可以调用该处理器的其他成员方法
var title = this.cleanTitle(
$( e.currentTarget ).data( 'title' );
); //做点什么吧...
} , cleanTitle: function( title ) {
//做点什么吧...
} , updatePost: function( e ) {
//做点什么吧...
} , searchPosts: function( e ) {
//做点什么吧...
} }); // 创建视图实例
var posts = new Posts();

模型(Model) API 参考

initialize: function() {}

参数:无;返回值:无

//该方法没有参数,也没有返回值,每次视图、模型和处理器被实例化时均会被调用
//使用方法:
var Person = Gillie.Model.extend({ //实例化时执行
initialize: function() {
console.log( 'Person model has been instantiated' );
}
}); // 创建实例,将输出" Person model has been instantiated "
var john = new Person();

defaults: {}


//实例化时的初始默认属性。若在模型中设定则会覆盖默认值,也可以使用实例化后模型变量的get(),set()方法设置新值。
//使用方法
var Person = Gillie.Model.extend({ // 默认属性
defaults: {
'alias': 'none'
, 'picture': 'default.jpg'
} }); // 实例化Person
var john = new Person();
// 默认情况下,John的picture属性对应default.jpg
john.get( 'picture' ); // default.jpg // 通过一下方式修改John的picture属性
john.set( 'picture', 'john-pic.jpg' );

url: {}

//该属性定义了所有请求方法的基础url 地址
//使用方法:
var Person = Gillie.Model.extend({ defaults: {
'picture': 'default.jpg'
} // 请求的默认URL地址
, url: 'http://localhost/api/v1/' // 存储
, save: function() { this.Post( 'person/', 'person.create' );
} }); var john = new Person({
'name': 'John'
, 'picture': 'john.jpg'
}); // 模型存储将会发送POST请求到'http://localhost/api/v1/person/'
john.save();

http请求方法,提供get .post ,put ,delete方法

model.Post( path, event, options )

Post model的post方法,参数为path,event,options,返回值XHR

参数

类型

详细说明

path

string

URL中除去base url的其他部分

event

string

当请求完成后,由model触发的事件

options

object

附加属性,作为ajax返回的其他参数传递,例如success,error等

//Post model的post方法,参数为path,event,options
//使用基础URL(base URL)组合path属性成一个完整URL,然后发送post请求。当请求完成后,触发带有这个key值的event事件。因此如果传递了resource.event作为event事件,将会由模型触发,同时监听者将获取到模型实例,并可将服务器响应的值作为参数传递过去。
//使用方法:
var Person = Gillie.Model.extend({ // 创建person
create: function( event ) {
this.Post( 'person/', event, {} );
} }); var david = new Person({
'location': 'Nevada'
, 'picture': 'david.jpg'
}); // 创建person,成功后触发’person.create’事件,从而视图可获知该事件然后基于新的模型数据渲染
david.create( 'person.create' );

model.Get( path, event, options )


//参数及返回值同Post
//使用方法
var Person = Gillie.Model.extend({ // 从服务器端获取数据
sync: function( event ) {
this.Get( 'person/:_id', event );
} }); // 创建person对象,并获取其信息
var maria = new Person({
_id: 10
}); // 获取maria的信息,请求完成后触发’person.get’事件
maria.get( 'person.get' );

model.Put( path, event, options )

//参数及返回值同post
//使用方法
var Person = Gillie.Model.extend({ // 更新person
update: function( event ) {
this.Put( 'person/:_id', event );
} }); var jordan = new Person({
'_id': 11
, 'localtion': 'New York'
}); // 更新Jordan的数据,请求完成后触发’person.update’事件
jordan.update( 'person.update' );

model.Delete( path, event, options )

//参数及返回值同Post
//使用方法
var Person = Gillie.Model.extend({ // 删除person
delete: function( event ) {
this.Delete( 'person/:_id', event );
} }); var jenny = new Person({
_id: 13
}) // 删除服务器上的person信息,完成后触发’person.delete’事件,监听者可据此改变dom以及类似的行为
jenny.delete( 'person.delete' );

get、set、unset

用于获取、设置和移除model属性

model.get( key ),返回值类型自定

参数

类型

详细说明

key

string

Model的属性

//获取model的某个属性
//使用方法
var Car = Gillie.Model.extend({}); // 创建一个新的car对象
var camaro = new Car({
year: 2014
, cubic_inches: 378
, manufacturer: 'Chevrolet'
}); // 获取并打印car 对象的 manufacturer属性
var manufacturer = camaro.get( 'manufacturer' );
console.log( manufacturer ); // Chevrolet

model.set( key, val )model.set( object ),返回值:Objectmodel实例

参数

类型

详细说明

key

stringOrobject

Name of the attribute we're setting. If we pass an object of key value pairs, there is no need to use the second parameter.

要设置的属性名。如果传递的是key-value对的对象,即不需要第二个参数

value

mixed

要存储的属性值(当第一个参数为对象时,不需要该参数)

options

object

作为ajax返回值传递,例如success,error等

//设置模型的某个属性或一组属性
//使用方法
var Car = Gillie.Model.extend({}); var camaro = new Car(); // 传递key-value值对
camaro.set( 'year', 2014 ); // 传递多个key-value组成的对象
camaro.set({
manufacturer: 'Chevrolet'
, cubic_inches: 378
}); // 获取属性值
console.log( camaro.get( 'year' ) ); //

unset model.unset( key )

//移除模型属性
//使用方法
var Car = Gillie.Model.extend({}); var camaro = new Car({
year: 2014
, cubic_inches: 378
, color: 'black'
}); // 移除car对象的color属性
camaro.unset( 'color' ); console.log( camaro.get( 'color' ) ); // null

model.toJSON(),返回值json对象

//以json对象格式返回模型中定义的属性
//使用方法
var Car = Gillie.Model.extend({}); var camaro = new Car({
year: 2014
, manufacturer: 'Chevrolet'
}); // 模型属性组合成对象
var attributes = camaro.toJSON();
console.log( attributes ); // { year: 2014, manufacturer: 'Chevrolet' }

events:

同view和model中的使用方法,用于触发和监听事件


视图API参考

gillie基于监听者设计模式,视图尝试监听模型事件,并在DOM上采取动作

initialize: function()

//初始化:创建视图实例时调用该初始化方法,用于声明该视图将监听哪些事件
//使用方法
var Post = Gillie.View.extend({ initialize: function() { // 监听模型’post.create’事件
model.on( 'post.create', this.onCreate );
} // post请求完成后调用
, onCreate: function( modelInstance, response ) { // 渲染dom
} }); // 创建post实例,同时运行初始化方法
var postView = new Post();

事件API参考

事件API提供了三种方法用于触发在view和Model中的事件。

on( event, fn ),返回当前实例,

参数

类型

详细说明

event

string orobject

绑定的事件。或者包含键值对的对象,即事件名称和对应回掉

fn, callback

function

事件触发时的回掉方法

//On()方法,用于监听事件,和触发回掉。
//使用方法
// 模型定义
var PostModel = Gillie.Model.extend({ url: 'http://localhost/api/v1/' , create: function() {
this.Post( 'post/', 'post.create' );
}
}); // 创建模型实例
postModel = new PostModel({
title: 'New post title'
, description: 'Lorem ipsum dolor sit amet'
}); // 视图定义
var PostsView = Gillie.View.extend({ initialize: function() { // 监听模型的’post.create’事件
postModel.on( 'posts.create', this.onCreate );
} // 当’posts.create’事件触发后回调用该方法
, this.onCreate: function( postInstance ) { console.log( postInstance.get( 'title' ) +
'. Has been created.'
);
}
});
postView = new PostView(); // 使用模型方法’create’来存储post请求。
//当post执行完成后,视图将会影响该事件,即打印‘New post title. Has been created’.
postModel.create();

trigger( event, data )

触发事件,同时传递一些特定的值给监听者,返回值当前实例

参数

类型

详细说明

event

string

触发的事件

data

mixed

传递给监听者的数据,可以是一个或多个参数

//使用方法
// 创建模型定义和模型实例
var PostModel = Gillie.Model.extend({});
var postModel = new PostModel(); // 视图定义
var PostView = Gillie.View.extend({ initialize: function() {
postModel.on( 'post.custom_event', this.onCustomEvent );
} , onCustomEvent: function( str, obj ) { console.log( str ); // 附加数据
console.log( obj ); // { one: 1, two: 2 }
}
}); // 创建视图实例
var postView = new PostView(); postModel.trigger(
'post.custom_event'
, 'Additional data'
, { one: 1, two: 2 }
);

object.listenTo( object, event, fn )

设置某个对象监听其他对象的事件,并且事件触发时调用回掉

参数

类型

详细说明

object

object

监听事件的对象

event

string

监听的事件名

fn

function

事件触发时的回掉

//使用方法
var PostModel = Gillie.Model.extend({});
var postModel = new PostModel(); // 视图定义
var PostView = Gillie.View.extend({ onEdit: function( attributes ) {
console.log( attributes ); // { title: 'New title' }
}
});
var postView = new PostView(); // 监听模型’post.change’事件
postView.listenTo( postModel, 'post.change', postView.onEdit ); // 触发模型事件
postModel.set( 'title', 'New title' )
.trigger( 'post.change', postModel.toJSON() )

整理如下:

Handler
属性定义 类型 说明 备注 参数 返回值
initialize function() 初始化处理器,在模型和视图中有类似的方法,每次实例创建时均被调用 每次视图、模型和处理器被实例化时均会调用对应的部分
el string 定义事件的容器,当指定该值到.post-box时,所有在事件属性中定义的事件,都将仅绑定到.post-box的内部元素 如果el没有指定,事件将绑定到document上    
events {} 对象类型,用于绑定dom事件,并且将其部署到处理器回调方法中 在回调中,上下文环境为处理器自身。也就是说,处理器中定义的方法可以在处理器其他方法的事件回调中调用    
Model
initialize function() 初始化处理器,在模型和视图中有类似的方法,每次实例创建时均被调用 每次视图、模型和处理器被实例化时均会调用对应的部分
defaults {} 实例化时的初始默认属性。若在模型中设定则会覆盖默认值,也可以使用实例化后模型变量的get(),set()方法设置新值。      
url string 该属性定义了所有请求方法的基础url 地址      
View
initialize function() 创建视图实例时调用该初始化方法,用于声明该视图将监听哪些事件 每次视图、模型和处理器被实例化时均会调用对应的部分
EVENT API
on( event, fn )   用于监听事件,和触发回掉。   event:string/object 当前实例
        fn, callback:function  
trigger( event, data )   触发事件,同时传递一些特定的值给监听者   event:string 当前实例
        data:mixed  
listenTo( object, event, fn )   设置某个对象监听其他对象的事件,并且事件触发时调用回掉   object object 监听事件的对象  
        event string 监听的事件名  
        fn function 事件触发时的回掉  
Model API
model.Post( path, event, options )   使用基础URL(base URL)组合path属性成一个完整URL,然后发送post请求。当请求完成后,触发带有这个key值的event事件。因此如果传递了resource.event作为event事件,将会由模型触发,同时监听者将获取到模型实例,并可将服务器响应的值作为参数传递过去。   path string URL中除去base url的其他部分 XHR
        event string 当请求完成后,由model触发的事件  
        options object 附加属性,作为ajax返回的其他参数传递,例如success,error等  
model.Get( path, event, options )       同post 同post
model.Put( path, event, options )       同post 同post
model.Delete( path, event, options )       同post 同post
model.get( key )   获取model的某个属性   key string Model的属性 Mixed(多种格式)
model.set( key, val ), model.set( object )   设置模型的某个属性或一组属性   key stringOrobject 要设置的属性名。如果传递的是key-value对的对象,即不需要第二个参数 model实例
        value mixed 要存储的属性值(当第一个参数为对象时,不需要该参数)  
        options object 作为ajax返回值传递,例如success,error等  
model.unset( key )   移除模型属性      
model.toJSON()   以json对象格式返回模型中定义的属性     JSON对象

手机端MVC-js框架-Gillie-中文版本的更多相关文章

  1. 手淘flexible.js框架使用和源代码讲解

    手淘框架是一个用来适配移动端的js框架,下面我们来讲解一下如何使用手淘的这套框架. 其实手淘框架的核心原理就是根据不同的width给网页中html跟节点设置不同的font-size,然后所有的距离大小 ...

  2. 手机端原生js实现下拉刷新数据

    HTML结构如下: <div class="outerScroller comment"> <div class='scroll comment'> < ...

  3. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

  4. JS 判断是否是手机端并跳转操作

    JS 判断运行当前脚本的应用程序是否为手机端或者一些其他信息,在我的工作中遇到的不是十分频繁,被我的同事一问就给问住了,所以把之前找到的一些知识点整理出来,供大家参考,若哪里不对欢迎指出,我会及时的更 ...

  5. 手写MVC框架(一)-再出发

    背景 前段时间把之前写的DAO框架(手写DAO框架(一)-从“1”开始)整理了一下,重构了一版.整理过程中看以前写的代码,只是为了了解实现,只是为了实现,代码写的有点粗糙.既然已经整理了DAO框架,索 ...

  6. js判断是否为手机端访问

    随着移动端越来越重要,pc和移动端网站后台系统可能是同一个,登录或者某个特定时期需要根据不同访问来源,跳转不同页面或者做不同的处理: 这时我们就需要js的 navigator 对象: 我们先了解一下n ...

  7. 《JS实现复制内容到剪贴板功能,可兼容所有PC浏览器,不兼容手机端》

    前记:本来原生的JS是有提供一个函数来实现这个功能(window.clipboardData),但是很遗憾,这个函数仅仅支持IE和FF浏览器,所以基本用处不大.下边介绍的是一个第三方插件库(ZeroC ...

  8. 移动手机端H5无缝间歇平滑向上滚动js代码

    在没结合css3的transform实现平滑过渡前,我都是用的jquery的animate方法,此方法在PC端基本看不出来有稍微卡顿的现象,但是在性能不高的手机上使用该方法,就会有明显的卡顿现象,不够 ...

  9. js 判断pc端或手机端

    <script> (function () { var navUA = navigator.userAgent; var defIncludeStr = "iPhone|Andr ...

  10. bootstrap实现 手机端滑动效果,滑动到下一页,jgestures.js插件

    bootstrap能否实现 手机端滑动效果,滑动到下一页 jgestures.js插件可以解决,只需要引入一个JS文件<script src="js/jgestures.min.js& ...

随机推荐

  1. PKU 1064 Cable master

    题目链接:点击打开链接 有n段绳子,给定n段绳子的长度,单位为厘米.求能够把这些绳子分成k段的最长的段的长度.题目中的trick是最小是1cm,长度不能小于1cm,因此要转换成int来解,然后二分可以 ...

  2. C++ Primer 随笔 Chapter 10 关联容器

    1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...

  3. bzoj1146

    这是一道无比繁琐的题目话说这道题使我第一次练dfs序,比较感动:首先dfs序就是在dfs过程中按照访问的顺序给每个点标上两个“时间戳”一个是第一次访问到点i时的时间戳c[i],一个是访问完以i为根时的 ...

  4. 【解决办法】糟糕,我的电脑只有IE64位浏览器能上网,其他软件都上不了网

      最近两周在三班四班有5位同学电脑7次出现网络故障,表现为能连上锐捷.DNS正常却不能上网,其中在我自己的计算机上就发生了2次.上网搜集并整理了以下资料,供大家参考.请直接参见[解决办法]. [网上 ...

  5. 今天知道了一个 反向代理,是apache 的一个功能,这里记录一下

    什么事情都需要自己 去弄,记住了这句话,不要以为 别人会来帮你 在 apache 的http.conf 文件中(去掉注释) LoadModule proxy_module modules/mod_pr ...

  6. ASP.NET网站发布-允许更新此预编译站点 打勾与不打勾的区别

    发布网站时在打开的对话框中,有一个选项是至关重要的,那就是“允许更新此预编译站点”: “允许更新此预编译站点”这一项,默认情况下,前面是打上一个√的,至于要不要打上一个√,是可选的,那么,打勾与不打勾 ...

  7. HDOJ(HDU) 2156 分数矩阵(嗯、求和)

    Problem Description 我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增. 请求 ...

  8. MakePic.com 图片制造 打造个性签名 拒绝垃圾邮件 生成个性印章

    MakePic.com 图片制造 打造个性签名 拒绝垃圾邮件 生成个性印章 欢迎使用MakePic.com

  9. php中应该哪怕被打断腿都要记得的几个函数

    php中应该哪怕被打断腿都要记得的几个函数: substr() 截取字符串 : explode() 使用一个字符串分割另一个字符串 : implode() 将数组用预定的字符连接成字符串: 下面有一个 ...

  10. jeecms v7

    http://bbs.jeecms.com/res_base/jeecms_com_bbs/upload/2015_11/jeecmsv7.zip 安装包 http://bbs.jeecms.com/ ...