Clouda API使用手冊之Touch Publish Subscribe
Touch
在開發移動端的應用中會使用到很多的手勢操作,例如一指拖動、兩指旋轉等等,為了方便開放者快速集成這些手勢,在Clouda中內置了事件和手勢庫Library.touch,下面將詳細的介紹如何使用Library.touch。
touch.config
語法: touch.config(config)
對手勢事件庫進行全局配置。
參數描述:
-
config為一個對象
- {
- tap: true, //tap類事件開關, 默認為true
- doubleTap: true, //doubleTap事件開關, 默認為true
- hold: true, //hold事件開關, 默認為true
- holdTime: 650, //hold時間長度
- swipe: true, //swipe事件開關
- swipeTime: 300, //觸發swipe事件的最大時長
- swipeMinDistance: 18, //swipe移動最小距離
- swipeFactor: 5, //加速因子, 值越大變化速率越快
- drag: true, //drag事件開關
- pinch: true, //pinch類事件開關
- }
touch.on
語法:touch.on(element, types, options, callback)
綁定指定元素的事件。
參數描述:
-
element: 元素對象或選擇器。
-
types: 事件的類型, 可接受多個事件以空格分開,支持原生事件的透傳, 支持的一些事件類型有:
| pinchstart | 雙指縮放動作開始 |
|---|---|
| pinchend | 雙指縮放動作結束 |
| pinch | 雙指縮放事件 |
| pinchin | 雙指向里縮小 |
| pinchout | 雙指向外放大 |
| rotateleft | 向左旋轉 |
| rotateright | 向右旋轉 |
| rotate | 旋轉事件 |
| swipestart | 單指滑動動作開始 |
| swiping | 單指滑動事件 |
| swipeend | 單指滑動動作結束 |
| swipeleft | 單指向左滑動 |
| swiperight | 單指向右滑動事件 |
| swipeup | 單指向上滑動 |
| swipedown | 單指向下滑動 |
| swipe | 單指滑動事件 |
| drag | 單指向左右拖動 |
| hold | 單指按住不放事件 |
| tap | 單指點擊 |
| doubletap | 單指雙擊 |
例如旋轉實例如下:
- var angle = 30;
- touch.on('#rotation .target', 'touchstart', function(ev){
- ev.startRotate();
- ev.originEvent.preventDefault();
- ev.originEvent.stopPropagation();
- });
- touch.on('#rotation .target', 'rotate', {interval: 10}, function(ev){
- var totalAngle = angle + ev.rotation;
- if(ev.fingerStatus === 'end'){
- angle = angle + ev.rotation;
- }
- this.style.webkitTransform = 'rotate(' + totalAngle + 'deg)';
- });
更多使用實例請查看http://code.baidu.com/
-
options(可選): 目前可配置的參數為:
- {
- //采樣頻率
- interval: 10,//性能參數,值越小,實時性越好, 但性能可能略差, 值越大, 性能越好。遇到性能問題時,可以將值設大調優,建議值設置為10。
- //swipe加速度因子(swipe事件專用)
- swipeFactor: 5 //(int: 1-10)值越大,速率更快。
- }
-
callback: 事件處理函數, 該函數接受的參數為一個gesture event object, 可訪問的屬性有:
-
originEvent //觸發某事件的原生對象
-
type //事件的名稱
-
rotation //旋轉角度
-
scale //縮放比例
-
direction //操作的方向屬性
-
fingersCount //操作的手勢數量
-
position //相關位置信息, 不同的操作產生不同的位置信息。
-
distance //swipe類兩點之間的位移
-
distanceX //swipe類事件x方向的位移
-
distanceY //swipe類事件y方向的位移
-
angle //swipe類事件觸發時偏移角度
-
factor //swipe事件加速度因子
-
startRotate //啟動單指旋轉方法,在某個元素的touchstart觸發時調用。
-
touch.live
語法:touch.live(selector, types, options, callback)
使用方法基本上與on相同,live的第一個參數只接受css3選擇器。通過live()方法附加的事件處理程序適用于匹配選擇器的當前及未來的元素(比如由腳本創建的新元素)
touch.off
語法:touch.off(element,types,callback)
解除某元素上的事件綁定。
參數描述:
-
element:元素對象或選擇器
-
types:事件的類型
-
callback:時間處理函數
#p#
Publish/Subscribe
subscribe
訂閱被發布的數據,與pubilsh配合使用
-
不帶參數 env.subscribe(publishName, function(collection){});
- env.subscribe("pub-allStudents", function(studentCollection){
- });
-
pulishName
所定義的Publish的唯一名稱,在一個App內全局唯一,該參數與sumeru.publish(modelName, publishName,function(callback))中的publishName名稱需要保持一致。
-
function(Collection){}
Subscribe成功獲得數據時,被調用的響應方法。
-
帶參數 env.subscribe(publishName,arg1,arg2, ... , function(collection){});
- env.subscribe("pub-StudentsWithGender", "male", function(msgCollection){
- });
-
subscribeByPage
分頁訂閱數據
-
不帶參數 env.subscribeByPage(publishName, options, function(collection){});
- var pageOption{
- pagesize : 1,
- page : 2,
- uniqueField : 'time'
- };
- env.subscribeByPage("pub-allStudents", pageOption, function(studentCollection){
- });
-
options
分頁設置
-
pageSize
每頁數據的數量
-
page
頁碼
-
uniqueField
排序的唯一字段名
-
-
帶參數 env.subscribeByPage(publishName, options, arg1,arg2, ... , function(collection){});
- env.subscribeByPage("pub-StudentsWithGender", pageOption, "male", function(msgCollection){
- });
-
-
prioritySubscribe
在斷線重新連接的情況下,使用prioritySubscribe方法訂閱數據優先被調用,使用方式與subscribe相同。
#p#
publish
發布數據的方法,其運行在Server上。
-
不帶參數 sumeru.publish(modelName,pubName,function(callback){},options)
-
modelName
被發布數據所屬的Model名稱
-
pubName
所定義的Publish的唯一名稱,在一個App內全局唯一,該參數與Controller中subscribe()成對使用。
-
function(callback)
描述數據發布規則的自定義函數,在這里定義被發布數據所需要符合的條件。
-
options
可在此添加以下六種事件
-
beforeInsert
在實際插入數據到數據庫前的事件
- beforeInsert : function(serverCollection, structData, userinfo, callback){
- callback(structData);
- }
-
structData
需要插入到數據庫的數據,我們可以對該數據進行操作,然后將數據插入到數據庫中,如果對數據沒有修改,則將原數據添加到數據庫中。
-
callback
before系列的事件中如果不添加 callback(),將阻止數據對數據庫的影響。
-
callback(structData)
如果需要對原數據進行修改,可以傳入參數structData
-
afterInsert
在實際插入數據到數據庫后的事件
- afterInsert : function(serverCollection, structData){
- }
-
beforeUpdate
在實際更新數據庫數據前的事件
- beforeUpdate : function(serverCollection, structData, userinfo, callback){
- callback();
- }
-
afterUpdate
在實際更新數據庫數據后的事件
- afterUpdate : function(serverCollection, structData){
- }
-
beforeDelete
在實際刪除數據庫數據前的事件
- beforeDelete : function(serverCollection, structData, userinfo, callback){
- callback();
- }
-
afterDelete
在實際刪除數據庫數據后的事件
- afterDelete : function(serverCollection, structData){
- }
-
實例:
- module.exports = function(sumeru){
- sumeru.publish('student', 'pub-allStudents', function(callback){
- var collection = this;
- collection.find({}, function(err, items){
- callback(items);
- });
- });
- }
-
-
帶參數 sumeru.publish(modelName,pubName,function(arg1, ..., callback){},options)
實例:
- module.exports = function(sumeru){
- sumeru.publish('student', 'pub-allStudents', function(gender,callback){
- var collection = this;
- collection.find({'gender':gender}, function(err, items){
- callback(items);
- });
- });
- }
-
publishByPage
分頁發布數據
sumeru.publishByPage(modelName,pubName,function(arg1,arg2,...,pageOptions, callback){},options)-
options
分頁設置,有Controller中subscribeByPage()傳入。
實例:
- sumeru.publishByPage('student', 'pub-allStudents', function(gender,options,callback){
- var collection = this;
- collection.find({ sort :{'time':-1},
- limit : options.pagesize,
- skip : (options.page-1)*options.pagesize,
- "gender": gender
- }, function(err, items){
- callback(items);
- });
- });
-
sort
排序
-
limit
每頁顯示的個數
-
skip
當前頁與起始頁間隔的個數
詳細的使用情況請查看《Example》文檔中的實例。
-
-
publishPlain
用于發布簡單對象,而非Collection。
sumeru.publishPlain(modelName,pubName,function(callback){},options)實例:
如果需要發布Collection中數據的總數量,可使用下面方法:
- fw.publishPlain('student', 'pub-allStudents', function(callback){
- var collection = this;
- collection.count({},function(err, count){
- callback(count);
- });
- });
下面的三種方法是包含權限中心的身份驗證的Publish。
-
securePublish
在身份驗證成功的情況下發布數據
sumeru.publish(modelName,pubName,function(userinfo, callback){},options) -
securePublishByPage
在身份驗證成功的情況下分頁發布數據
sumeru.securePublishByPage(modelName,pubName,function(pageOptions,userinfo, callback){},options) -
securePublishPlain
在身份驗證成功的情況下發布簡單對象
sumeru.securePublishPlain(modelName,pubName,function(userinfo, callback){},options) -
external
實現了三方數據同步的方法,用來滿足從三方網站/三方接口獲取和同步數據的需求。
-
extfind(pubName,callback)
在publish文件中發布第三方數據
- fw.publish('news','pubnews',function(callback){
- var collection = this;
- collection.extfind('pubnews',callback);
- });
使用該方法需要在publish下添加一個如何獲取第三方數據的配置文件
-
config[pubname]
-
pubname
與publish中collection.extfind(pubname,callback)方法pubname一致,全局唯一
-
uniqueColumn
uniqueColumn為三方數據唯一標識,類型為
StringuniqueColumn : "name", -
fetchUrl: function((/** arg1, arg2, arg3 */)){}
指定抓取的URL。arg1,arg2為傳遞的參數
- fetchUrl : function(/** arg1, arg2, arg3 */){
- return 'http://some.host.com';
- }
-
resolve : function(originData){}
resolve方法作用是將抓取回來的原始數據(originData)轉化成為符合Model定義的數據(resolved)
- resolve : function(originData){
- var j = JSON.parse(originData);
- var resolved = j;
- return resolved;
- }
-
fetchInterval
fetchInterval為可選參數,用來指定抓取時間間隔,單位為ms
-
buffer
buffer為可選參數,值為true時表示獲取原始Buffer,否則獲取原始數據字符串
-
type
聲明此模塊為歸屬為'external'
- return {
- type : 'external',
- config : config
- }
實例如下:
- /**
- * 獲取三方數據信息,由開發者自定義
- */
- function runnable(){
- //{Object} config是所有三方publish配置的容器
- var config = {};
- config['pubext'] = {
- //{String} uniqueColumn為三方數據唯一標識
- uniqueColumn : "name",
- //{Function} fetchUrl的參數就是訂閱時發起的參數,返回值為pubext所抓取的url地址
- fetchUrl : function(/** arg1, arg2, arg3 */){
- return 'http://some.host.com';
- },
- //{Function} resolve方法作用是將抓取回來的原始數據(originData)轉化成為符合Model定義的數據(resolved)
- resolve : function(originData){
- var j = JSON.parse(originData);
- var resolved = j;
- return resolved;
- },
- //{Number} fetchInterval為可選參數,用來指定抓取時間間隔,單位為ms
- fetchInterval : 60 * 1000,
- //{Boolean} buffer為可選參數,值為true時表示獲取原始Buffer,否則獲取原始數據字符串
- buffer : false
- }
- //最后需要聲明此模塊為歸屬為'external'
- return {
- type : 'external',
- config : config
- }
- }
- module.exports = runnable;
-
-
指定三方增/刪/改接口以及數據
當數據發生變化時,如何使用Clouda達到三方數據同步的效果,具體實現方法如下:
-
較為緊湊的聲明方式
-
postUrl
postUrl方法用來指定三方post接口的地址信息, 參數type為增量類型,增量類型為'insert','update','delete'三者之一; -
prepare
prepare方法用來將增量數據轉化成為符合三方POST接口要求的post數據,參數type同為增量類型,參數data為增量的實際數據。
實例如下:
- /**
- * 三方數據POST請求信息,由開發者自定義
- */
- function runnable(){
- var config = {}
- config['pubext'] = {
- /**
- * 聲明三方POST接口地址
- * {String} type為'delete', 'insert', 'update'其中之一
- * 如果subscribe時帶參數,參數會按照subscribe順序接在postUrl的參數中
- */
- postUrl : function(type /** arg1, arg2, arg3... */){
- var options = {
- host : 'some.host.com',
- path : '/' + type ,
- headers: {
- //在此自定義header內容,clouda默認的 'Content-Type': 'application/x-www-form-urlencoded'
- 'Content-Type': ...
- }
- }
- return options;
- },
- /**
- * prepare方法將增量數據轉化為符合三方要求的post數據。
- * {String} type為增量操作,值為'delete', 'insert', 'update'其一;
- * {Object} data為增量數據,如:{ name : 'user1', age : 26 }。
- */
- prepare : function(type, data){
- var prepareData = {}; //prepareData為三方post所需的data
- if(type === "delete"){
- prepareData.name = data.name;
- }else if(type === "insert"){
- prepareData.name = data.name;
- prepareData.age = data.age;
- }else{
- prepareData.name = data.name;
- prepareData.age = data.age;
- }
- return prepareData;
- }
- }
- return {
- type : 'external',
- config : config
- }
- }
- module.exports = runnable;
-
-
較為工整的聲明方式
-
deleteUrl,insertUrl,updateUrl三個方法作用等同于
postUrl,返回不同操作下三方接口url信息 -
onDelete,onInsert,onUpdate三個方法作用等同于
prepare方法, 返回經過處理,傳給三方接口的post數據
實例如下:
- function runnable(){
- var config = {};
- config['pubext'] = {
- //arg1, arg2, arg3是subscribe時輸入的參數
- deleteUrl : function(/** arg1, arg2, arg3... */){
- return {
- host : 'some.host.com',
- path : '/delete'
- }
- },
- insertUrl : function(/** arg1, arg2, arg3... */){
- return {
- host : 'some.host.com',
- path : '/insert'
- }
- },
- updateUrl : function(/** arg1, arg2, arg3... */){
- return {
- host : 'some.host.com',
- path : '/update'
- }
- },
- onInsert : function(data){
- var prepareData = {};
- prepareData.name = data.name;
- prepareData.age = data.age;
- return prepareData;
- },
- onUpdate : function(data){
- var prepareData = {};
- prepareData.name = data.name;
- prepareData.age = data.age;
- return prepareData;
- },
- onDelete : function(data){
- var prepareData = {}
- prepareData.name = data.name;
- return prepareData;
- }
- }
- return {
- type : 'external',
- config : config
- }
- }
- module.exports = runnable;
-
-
-
sumeru.external.get
向第三方發送get請求
- var url = "http://some.host.com";
- var getCallback = function(data){
- console.log(data);
- }
- sumeru.external.get(url, getCallback);
-
sumeru.external.post
向第三方發送post請求
- var options = {
- host : "some.host.com",
- path : "/insert"
- }
- var postData = {
- name : sumeru.utils.randomStr(8),
- age : parseInt( 100 * Math.random())
- }
- var postCallback = function(data){
- console.log(data);
- }
- sumeru.external.post(options, postData, postCallback);
具體使用請查看《Example》文檔中的SpiderNews實例。
-

















