diff --git a/README.md b/README.md index 0b72a0d..4aca0e3 100644 --- a/README.md +++ b/README.md @@ -1,385 +1,385 @@ -![](https://raw.github.com/miller/Chassis/master/docs/chassis.png) -======= - -## 内容导航 - * [Chassis是什么?](#1-chassis%E6%98%AF%E4%BB%80%E4%B9%88) - * [Chassis有多轻量级?](#2-chassis%E6%9C%89%E5%A4%9A%E8%BD%BB%E9%87%8F%E7%BA%A7) - * [Chassis适合什么样开发场景?](#3-chassis%E9%80%82%E5%90%88%E4%BB%80%E4%B9%88%E6%A0%B7%E5%BC%80%E5%8F%91%E5%9C%BA%E6%99%AF) - * [Chassis入门](#4-chassis%E5%85%A5%E9%97%A8) - * [准备工作](#4-1-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C) - * [路由规则](#4-2-%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99) - * [开发首页](#4-3-%E5%BC%80%E5%8F%91%E9%A6%96%E9%A1%B5) - * [模板](#4-3-1-%E6%A8%A1%E6%9D%BF) - * [Model](#4-3-2-model) - * [视图](#4-3-3-%E8%A7%86%E5%9B%BE) - * [开发详情页](#4-4-%E5%BC%80%E5%8F%91%E8%AF%A6%E6%83%85%E9%A1%B5) - * [模板](#4-4-1-%E6%A8%A1%E6%9D%BF) - * [Model](#4-4-2-model) - * [视图](#4-4-3-%E8%A7%86%E5%9B%BE) - * [更多文档](#5-%E6%9B%B4%E5%A4%9A%E6%96%87%E6%A1%A3) - -##1. Chassis是什么? - -Chassis源于百度内部的Rocket项目,是一套以提高Webapp开发效率为目的的开发框架。它提供了一套类Backbone的MVC代码架构,在此基础上延伸了视图层管理,优化了路由控制以及更加轻量级的实现。此外,基于Chassis的视图分层和开发规范,可以实现非常灵活的分工协作。 - -##2. Chassis有多轻量级? - -Chassis在实现上采用了多种组件化方案,开发者可以根据需求实现灵活定制。在体积上,轻量级版本Chassis只有 `4.8KB` (gzip)。 - -##3. Chassis适合什么样开发场景? - -如果你的项目满足以下特点(或需求)将会非常适合使用Chassis作为开发框架: - - * 单页面应用(SPA) - * 路由管理 - * 视图管理(视图分层、视图切换、视图智能回收等) - -##4. Chassis入门 - -假设我们需要开发一个非常简单的APP,由两个页面组成:一个列表页以及一个详情页。APP默认页面为列表页,点击列表页会切换到详情页。 - -[PC请点击此处查看效果](http://responsivepx.com/?chassis.duapp.com%2Fexamples%2Fmusic%2F#320x640&scrollbars) [source](https://github.com/BaiduFE/Chassis/tree/master/examples/music) - -手机请访问 `t.cn/zH0WkZn` - -###4-1. 准备工作 - -首先我们需要引入基础的JS脚本库。Chassis本身唯一的依赖是DOM脚本库,你可以选择使用[zepto](http://zeptojs.com/)、[jQuery](http://jquery.com)或者[ender](https://ender.no.de/)。 - -此外,在实际项目中通常还需要用到前端模板,因此还需要引入模板库,例子中使用的是[Mustache](https://github.com/janl/mustache.js)。 - -最后引入Chassis,这样脚本库的准备工作就完成了。 - -```html - - - -``` - -###4-2. 路由规则 - -接下来我们需要确定APP的路由规则,这直接影响到视图层的组织。本例中包含两个页面:首页以及详情页,我们给每个页面分配一个ID:`index`和`detail`。页面对应的访问路径分别是:`http://yourdomain.com`和`http://yourdomain.com#/detail/123` - -`index`页面由于为首页而且无参数,因此它对应的路由规则为空字符串; - -`detail`页面需要参数来获取数据,因此`detail`页面对应的路由为`/detail/123`,为了在页面初始化时能够获得参数,我们把`detail`页面的路由规则定义为`detail/:albumId`。 - -接下来我们就可以初始化路由管理了。 - -```javascript -Chassis.history.start( { - router: { - routes: [ '', 'detail/:albumId' ] - } -} ); -``` - -以上的路由定义含义为:当URL中路由路径为空以及`detail/:albumId`时会切换到相应的视图;`detail/:albumId`则对应`detail`视图。Chassis中空路径默认对应ID为`index`的视图,因此路由规则可以简化: - -```javascript -routes: [ 'detail/:albumId' ] -``` - -如果实际应用中路由规则中的字符串无法和视图ID对应则可以换用以下方式: - -```javascript -routes: { - // 空路由会定位到home视图 - '': 'home', - // 定位到album视图 - 'detail/:albumId': 'album' -} -``` - -更多信息请参考[《Chassis的路由使用》](https://github.com/BaiduFE/Chassis/issues/9)。 - -###4-3. 开发首页 - -在路由确定后我们就可以正式进行视图开发了,让我们先来完成首页。 - -首先,我们需要为页面数据的显示准备相应的模板,这里使用`Mustache`语法,如下。 - -####4-3-1. 模板 - -```html - -``` - -现在我们需要定义视图对应的数据。 - -####4-3-2. Model - -```javascript -Chassis.Model.define( 'index', { - url : function() { - return 'data/albums.php'; - }, - parse : function( resp ) { - var album_list = resp.plaze_album_list.RM.album_list, - list = album_list.list; - for( var i = 0, len = list.length; i < len; i++ ) { - list[ i ].rank = i + 1; - } - return album_list; - } -} ); -``` - -通过`Chassis.Model.define`接口可以定义数据Model, 第一个参数为Model的ID, 建议和对应视图的ID保持一致,第二个参数为Model原型方法和属性。 - -这里使用了`url`和`parse`方法,`url`返回的结果会作为获取数据的目标路径;`parse`返回的结果会作为Model的最终数据。 - -更多信息请参考[《Chassis的模型使用》](https://github.com/BaiduFE/Chassis/issues/31)。 - -这之后就是视图的定义了。 - -####4-3-3. 视图 - -```javascript -Chassis.PageView.define( 'index', { - // 设置PageView所在的DOM - el: '#album-list', - // 配置事件 - events: { - // 监听model change - 'change model': 'onModelChange' - }, - init: function( opts ) { - this.model = Chassis.Model.create( 'index' ); - }, - // 在APP路由到当前页面之前会调用该方法 - onBeforePageIn: function() { - // 获取数据 - if ( !this.model.fetched ) { - this.showLoading(); - this.model.fetch(); - this.model.fetched = true; - } - }, - onModelChange: function( ) { - // 渲染模板并输出 - this.$el.html( - Mustache.render( $( '#index-template' ).html(), - this.model.toJSON() ) - ); - // 隐藏Loading - this.hideLoading(); - } -} ); -``` - -接下来详细介绍一下如何定义一个视图。 - -首先你需要了解`Chassis.PageView.define`接口。该接口接收两个参数,第一个参数为页面的ID,与路由规则中的ID一一对应;第二个参数则为视图原型的属性和方法。 - -在原型上: - -```javascript -el: '#album-list', -``` - -设置视图所关联的DOM结点,在视图中`this.$el`可以获得DOM的jQuery封装对象。 它是整个视图的宿主DOM结点,视图的切换、显示、隐藏以及默认的事件等都作用在结点上。 - -```javascript -events: { - // 监听model change - 'change model': 'onModelChange', - // 监听model error - 'error model': 'onModelError' -}, -``` - -通过`events`对象可以统一配置各种事件的处理方法,这里不仅仅能配置内部DOM结点的事件,还包括了view、model以及document和window。 - - * `'click .btn': handler` :点击`this.$el`上class为`.btn`的DOM结点; - * `'change model: handler'` :监听`this.model`的`change`事件; - * `'beforepagein view': handler` :监听当前视图的`beforepagein`事件; - * `'click window': handler` :点击window; - * `'click document': handler` :点击document; - -通过`events`对象配置的事件,在调用视图的`destroy`方法后都能被正确移除, 因此建议事件统一在此配置。 - -```javascript -init: function( opts ) { - this.model = Chassis.Model.create( 'index' ); -}, -``` - -定义初始化操作,这里在初始化时创建了视图对应的数据Model。 - -```javascript -onBeforePageIn: function() { - // 获取数据 - if ( !this.model.fetched ) { - this.showLoading(); - this.model.fetch(); - this.model.fetched = true; - } -}, -``` - -`onBeforePageIn`方法在视图即将切换到当前视图之前会自动调用, 你可以在此进行视图展示前的预处理,比如此处会提前显示loading效果并请求数据。对应的还有`onAfterPageIn`、`onBeforePageOut`以及`onAfterPageOut`方法。 - -```javascript -onModelChange: function( ) { - // 渲染模板并输出 - this.$el.html( - Mustache.render( $( '#index-template' ).html(), - this.model.toJSON() ) - ); - // 隐藏Loading - this.hideLoading(); -} -``` - -此处监听Model数据,在数据返回后会获取页面模板进行渲染,最后因此loading。 - -至此,首页的代码就完成了。 - -###4-4. 开发详情页 - -####4-4-1. 模板 - -```html - -``` - -####4-4-2. Model - -```javascript -Chassis.Model.Detail = Chassis.Model.extend( { - url : function() { - return 'data/info.php'; - }, - - parse : function( resp ) { - var list = resp.songlist; - resp.albumInfo.simpleinfo = resp.albumInfo.info.substring(0, 70) + '...'; - for( var i = 0, len = list.length; i < len; i++ ) { - list[ i ].rank = i + 1; - } - return resp; - } -} ); -``` - -####4-4-3. 视图 - -```javascript -Chassis.PageView.define( 'detail', { - // 设置PageView所在的DOM - el: '#album-detail', - // 配置事件 - events: { - // 监听model change - 'change model': 'onModelChange', - // expand - 'click .expand': 'onExpand' - }, - init: function( opts ) { - this.model = new Chassis.Model.Detail(); - }, - // 在APP路由到当前页面之前会调用该方法 - onBeforePageIn: function( e ) { - this.$el.html( '' ); - this.showLoading(); - // 获取数据 - this.model.fetch({ - data : { - id : e.params.albumId - } - }); - - }, - onModelChange: function( ) { - // 渲染模板并输出 - this.$el.html( - Mustache.render( $( '#detail-template' ).html(), - this.model.toJSON() ) - ); - // 隐藏Loading - this.hideLoading(); - }, - onExpand: function( e ) { - e.preventDefault(); - var $info = this.$( '.mod .info p' ); - $info.html( $info.attr( 'data-info' ) ); - } -} ); -``` - -到此一个最简单的Chassis应用就开发完了,关于Chassis的更多细节请参考: - -##5. 更多文档 - -[Chassis入门文档](https://github.com/BaiduFE/Chassis/issues/28) - - - - - +![](https://raw.github.com/miller/Chassis/master/docs/chassis.png) +======= + +## 内容导航 + * [Chassis是什么?](#1-chassis%E6%98%AF%E4%BB%80%E4%B9%88) + * [Chassis有多轻量级?](#2-chassis%E6%9C%89%E5%A4%9A%E8%BD%BB%E9%87%8F%E7%BA%A7) + * [Chassis适合什么样开发场景?](#3-chassis%E9%80%82%E5%90%88%E4%BB%80%E4%B9%88%E6%A0%B7%E5%BC%80%E5%8F%91%E5%9C%BA%E6%99%AF) + * [Chassis入门](#4-chassis%E5%85%A5%E9%97%A8) + * [准备工作](#4-1-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C) + * [路由规则](#4-2-%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99) + * [开发首页](#4-3-%E5%BC%80%E5%8F%91%E9%A6%96%E9%A1%B5) + * [模板](#4-3-1-%E6%A8%A1%E6%9D%BF) + * [Model](#4-3-2-model) + * [视图](#4-3-3-%E8%A7%86%E5%9B%BE) + * [开发详情页](#4-4-%E5%BC%80%E5%8F%91%E8%AF%A6%E6%83%85%E9%A1%B5) + * [模板](#4-4-1-%E6%A8%A1%E6%9D%BF) + * [Model](#4-4-2-model) + * [视图](#4-4-3-%E8%A7%86%E5%9B%BE) + * [更多文档](#5-%E6%9B%B4%E5%A4%9A%E6%96%87%E6%A1%A3) + +## 1. Chassis是什么? + +Chassis源于百度内部的Rocket项目,是一套以提高Webapp开发效率为目的的开发框架。它提供了一套类Backbone的MVC代码架构,在此基础上延伸了视图层管理,优化了路由控制以及更加轻量级的实现。此外,基于Chassis的视图分层和开发规范,可以实现非常灵活的分工协作。 + +## 2. Chassis有多轻量级? + +Chassis在实现上采用了多种组件化方案,开发者可以根据需求实现灵活定制。在体积上,轻量级版本Chassis只有 `4.8KB` (gzip)。 + +## 3. Chassis适合什么样开发场景? + +如果你的项目满足以下特点(或需求)将会非常适合使用Chassis作为开发框架: + + * 单页面应用(SPA) + * 路由管理 + * 视图管理(视图分层、视图切换、视图智能回收等) + +## 4. Chassis入门 + +假设我们需要开发一个非常简单的APP,由两个页面组成:一个列表页以及一个详情页。APP默认页面为列表页,点击列表页会切换到详情页。 + +[PC请点击此处查看效果](http://responsivepx.com/?chassis.duapp.com%2Fexamples%2Fmusic%2F#320x640&scrollbars) [source](https://github.com/BaiduFE/Chassis/tree/master/examples/music) + +手机请访问 `t.cn/zH0WkZn` + +### 4-1. 准备工作 + +首先我们需要引入基础的JS脚本库。Chassis本身唯一的依赖是DOM脚本库,你可以选择使用[zepto](http://zeptojs.com/)、[jQuery](http://jquery.com)或者[ender](https://ender.no.de/)。 + +此外,在实际项目中通常还需要用到前端模板,因此还需要引入模板库,例子中使用的是[Mustache](https://github.com/janl/mustache.js)。 + +最后引入Chassis,这样脚本库的准备工作就完成了。 + +```html + + + +``` + +### 4-2. 路由规则 + +接下来我们需要确定APP的路由规则,这直接影响到视图层的组织。本例中包含两个页面:首页以及详情页,我们给每个页面分配一个ID:`index`和`detail`。页面对应的访问路径分别是:`http://yourdomain.com`和`http://yourdomain.com#/detail/123` + +`index`页面由于为首页而且无参数,因此它对应的路由规则为空字符串; + +`detail`页面需要参数来获取数据,因此`detail`页面对应的路由为`/detail/123`,为了在页面初始化时能够获得参数,我们把`detail`页面的路由规则定义为`detail/:albumId`。 + +接下来我们就可以初始化路由管理了。 + +```javascript +Chassis.history.start( { + router: { + routes: [ '', 'detail/:albumId' ] + } +} ); +``` + +以上的路由定义含义为:当URL中路由路径为空以及`detail/:albumId`时会切换到相应的视图;`detail/:albumId`则对应`detail`视图。Chassis中空路径默认对应ID为`index`的视图,因此路由规则可以简化: + +```javascript +routes: [ 'detail/:albumId' ] +``` + +如果实际应用中路由规则中的字符串无法和视图ID对应则可以换用以下方式: + +```javascript +routes: { + // 空路由会定位到home视图 + '': 'home', + // 定位到album视图 + 'detail/:albumId': 'album' +} +``` + +更多信息请参考[《Chassis的路由使用》](https://github.com/BaiduFE/Chassis/issues/9)。 + +### 4-3. 开发首页 + +在路由确定后我们就可以正式进行视图开发了,让我们先来完成首页。 + +首先,我们需要为页面数据的显示准备相应的模板,这里使用`Mustache`语法,如下。 + +#### 4-3-1. 模板 + +```html + +``` + +现在我们需要定义视图对应的数据。 + +#### 4-3-2. Model + +```javascript +Chassis.Model.define( 'index', { + url : function() { + return 'data/albums.php'; + }, + parse : function( resp ) { + var album_list = resp.plaze_album_list.RM.album_list, + list = album_list.list; + for( var i = 0, len = list.length; i < len; i++ ) { + list[ i ].rank = i + 1; + } + return album_list; + } +} ); +``` + +通过`Chassis.Model.define`接口可以定义数据Model, 第一个参数为Model的ID, 建议和对应视图的ID保持一致,第二个参数为Model原型方法和属性。 + +这里使用了`url`和`parse`方法,`url`返回的结果会作为获取数据的目标路径;`parse`返回的结果会作为Model的最终数据。 + +更多信息请参考[《Chassis的模型使用》](https://github.com/BaiduFE/Chassis/issues/31)。 + +这之后就是视图的定义了。 + +#### 4-3-3. 视图 + +```javascript +Chassis.PageView.define( 'index', { + // 设置PageView所在的DOM + el: '#album-list', + // 配置事件 + events: { + // 监听model change + 'change model': 'onModelChange' + }, + init: function( opts ) { + this.model = Chassis.Model.create( 'index' ); + }, + // 在APP路由到当前页面之前会调用该方法 + onBeforePageIn: function() { + // 获取数据 + if ( !this.model.fetched ) { + this.showLoading(); + this.model.fetch(); + this.model.fetched = true; + } + }, + onModelChange: function( ) { + // 渲染模板并输出 + this.$el.html( + Mustache.render( $( '#index-template' ).html(), + this.model.toJSON() ) + ); + // 隐藏Loading + this.hideLoading(); + } +} ); +``` + +接下来详细介绍一下如何定义一个视图。 + +首先你需要了解`Chassis.PageView.define`接口。该接口接收两个参数,第一个参数为页面的ID,与路由规则中的ID一一对应;第二个参数则为视图原型的属性和方法。 + +在原型上: + +```javascript +el: '#album-list', +``` + +设置视图所关联的DOM结点,在视图中`this.$el`可以获得DOM的jQuery封装对象。 它是整个视图的宿主DOM结点,视图的切换、显示、隐藏以及默认的事件等都作用在结点上。 + +```javascript +events: { + // 监听model change + 'change model': 'onModelChange', + // 监听model error + 'error model': 'onModelError' +}, +``` + +通过`events`对象可以统一配置各种事件的处理方法,这里不仅仅能配置内部DOM结点的事件,还包括了view、model以及document和window。 + + * `'click .btn': handler` :点击`this.$el`上class为`.btn`的DOM结点; + * `'change model: handler'` :监听`this.model`的`change`事件; + * `'beforepagein view': handler` :监听当前视图的`beforepagein`事件; + * `'click window': handler` :点击window; + * `'click document': handler` :点击document; + +通过`events`对象配置的事件,在调用视图的`destroy`方法后都能被正确移除, 因此建议事件统一在此配置。 + +```javascript +init: function( opts ) { + this.model = Chassis.Model.create( 'index' ); +}, +``` + +定义初始化操作,这里在初始化时创建了视图对应的数据Model。 + +```javascript +onBeforePageIn: function() { + // 获取数据 + if ( !this.model.fetched ) { + this.showLoading(); + this.model.fetch(); + this.model.fetched = true; + } +}, +``` + +`onBeforePageIn`方法在视图即将切换到当前视图之前会自动调用, 你可以在此进行视图展示前的预处理,比如此处会提前显示loading效果并请求数据。对应的还有`onAfterPageIn`、`onBeforePageOut`以及`onAfterPageOut`方法。 + +```javascript +onModelChange: function( ) { + // 渲染模板并输出 + this.$el.html( + Mustache.render( $( '#index-template' ).html(), + this.model.toJSON() ) + ); + // 隐藏Loading + this.hideLoading(); +} +``` + +此处监听Model数据,在数据返回后会获取页面模板进行渲染,最后因此loading。 + +至此,首页的代码就完成了。 + +### 4-4. 开发详情页 + +#### 4-4-1. 模板 + +```html + +``` + +#### 4-4-2. Model + +```javascript +Chassis.Model.Detail = Chassis.Model.extend( { + url : function() { + return 'data/info.php'; + }, + + parse : function( resp ) { + var list = resp.songlist; + resp.albumInfo.simpleinfo = resp.albumInfo.info.substring(0, 70) + '...'; + for( var i = 0, len = list.length; i < len; i++ ) { + list[ i ].rank = i + 1; + } + return resp; + } +} ); +``` + +#### 4-4-3. 视图 + +```javascript +Chassis.PageView.define( 'detail', { + // 设置PageView所在的DOM + el: '#album-detail', + // 配置事件 + events: { + // 监听model change + 'change model': 'onModelChange', + // expand + 'click .expand': 'onExpand' + }, + init: function( opts ) { + this.model = new Chassis.Model.Detail(); + }, + // 在APP路由到当前页面之前会调用该方法 + onBeforePageIn: function( e ) { + this.$el.html( '' ); + this.showLoading(); + // 获取数据 + this.model.fetch({ + data : { + id : e.params.albumId + } + }); + + }, + onModelChange: function( ) { + // 渲染模板并输出 + this.$el.html( + Mustache.render( $( '#detail-template' ).html(), + this.model.toJSON() ) + ); + // 隐藏Loading + this.hideLoading(); + }, + onExpand: function( e ) { + e.preventDefault(); + var $info = this.$( '.mod .info p' ); + $info.html( $info.attr( 'data-info' ) ); + } +} ); +``` + +到此一个最简单的Chassis应用就开发完了,关于Chassis的更多细节请参考: + +## 5. 更多文档 + +[Chassis入门文档](https://github.com/BaiduFE/Chassis/issues/28) + + + + + diff --git a/docs/README.md b/docs/README.md index 360a96e..a17bf10 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,2 +1,2 @@ -#DOCS +# DOCS diff --git a/examples/README.md b/examples/README.md index 7a7143c..9b1459c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1 +1 @@ -#EXAMPLES +# EXAMPLES diff --git a/examples/fis-project/common/gmu-GMU_2.0.3_TAG1/README.md b/examples/fis-project/common/gmu-GMU_2.0.3_TAG1/README.md index ca8e5f2..28956c8 100644 --- a/examples/fis-project/common/gmu-GMU_2.0.3_TAG1/README.md +++ b/examples/fis-project/common/gmu-GMU_2.0.3_TAG1/README.md @@ -1,8 +1,8 @@ -gmu -======= - -通用移动ui组件库 - -基于zepto开发的,符合jqueryui使用规范的通用移动ui组件库 - +gmu +======= + +通用移动ui组件库 + +基于zepto开发的,符合jqueryui使用规范的通用移动ui组件库 + email:gmu@baidu.com \ No newline at end of file diff --git a/examples/hacknews/README.md b/examples/hacknews/README.md index 54c1ab1..1b3f478 100644 --- a/examples/hacknews/README.md +++ b/examples/hacknews/README.md @@ -1,7 +1,7 @@ -这个例子演示了pushState结合后端的使用。 - -同时这个例子的服务架设在duapp上:[hacknews](http://hacknews.duapp.com) - -如果自己架设服务,需要申请sina WB_AKEY - -TODO +这个例子演示了pushState结合后端的使用。 + +同时这个例子的服务架设在duapp上:[hacknews](http://hacknews.duapp.com) + +如果自己架设服务,需要申请sina WB_AKEY + +TODO diff --git a/examples/hacknews/static/flatui/README.md b/examples/hacknews/static/flatui/README.md index 3cbc1f2..87bcc5d 100644 --- a/examples/hacknews/static/flatui/README.md +++ b/examples/hacknews/static/flatui/README.md @@ -34,7 +34,7 @@ Thanks for supporting our website and enjoy! ## Typeface Flat UI Free is made using the Lato typeface, which can be downloaded for free here: http://www.google.com/webfonts/specimen/Lato -##Useful Links (How To) +## Useful Links (How To) How to Use UI Kits, Beginners Video Tips: [http://designmodo.com/how-to-use/](http://designmodo.com/how-to-use/) diff --git a/examples/music/README.md b/examples/music/README.md index bf6d91c..fe70761 100644 --- a/examples/music/README.md +++ b/examples/music/README.md @@ -1,4 +1,4 @@ -###Chassis Webapp Demo +### Chassis Webapp Demo ### How to