## Data組件基礎02:規則、數據遍歷查找
**一、Data組件的規則**
Data組件提供了規則執行的機制,在data上可以定義:計算、只讀、必填、約束等規則,規則都是以表達式的形式給出,表達式計算結果為true時只讀、必填生效,約束表達式計算結果=true時數據有效
Data只讀上下文包括:
$model : 前端model對象
$data : data組件對象
表達式上下文包括:
$model : 前端model對象
$data : data組件對象
$row : 計算的行對象
$rowID : 計算的行ID
$col : 列名
注:對于整個data只有只讀的規則,必填和約束規則只有數據進行修改后才會觸發
[](https://box.kancloud.cn/2015-09-23_560181fe09e7a.png)
<rule>
<!-- 整個data只讀 -->
<readonly
<expr >true</expr>
</readonly>
<!-- fString列必須有值 -->
<col name="fString">
<required>
<expr>true</expr>
<message>請填寫fString</message>
</required>
</col>
<!-- fInteger必須大于50 -->
<col name="fInteger">
<constraint>
<expr>val('fInteger')>50</expr>
<message>Integer必須大于50</message>
</constraint>
</col>
<!-- fDecimal只讀并且是slaveData的fDecimal列合計 -->
<col name="fDecimal">
<readonly>
<expr>true</expr>
</readonly>
<calculate>
<!-- 計算規則在data組件創建時就開始計算,
這時有可能使用到的data還沒有創建
所以增加"$model.slaveData?..."的判斷 -->
<expr>$model.slaveData?$model.slaveData.sum('fDecimal',$row):0</expr>
</calculate>
</col>
</rule>
Data組件的約束規則其實是提供了擴展能力的(如:email等),有興趣的可以研究一下“/UI2/system/components/justep/data/js/rules.js”
后續的進階篇中會作介紹
**二、數據遍歷和查找**
Data組件數據遍歷方式有兩種,一種使用游標滾動方式,另一種使用Data.each()函數。
下面詳細介紹這兩種方式的差異和使用方式
游標滾動方式,這種方式由于刺激了當前行的變化,所有綁定當前行的數據感知組件都會進行變化渲染
相關API:
Data.getFirstRow();——-獲取第一行
Data.getLastRow();——–獲取最后一行
Data.next();————–游標移動到下一行
Data.pre();—————游標移動到上一行
Data.first();————–游標移動到第一行
Data.last();—————游標移動到最后一行
Data.to(row);————-游標移動到指定行
全數據游標滾動數據遍歷代碼實例:
var data = this.comp('fruitData');
var lRow = data.getLastRow(), row, names = [];
data.first();
do {
row = data.getCurrentRow();
names.push(data.val('fName'));
data.next();
} while (lRow != row);
alert(names);
Data.each(callback)遍歷,這種方式不刺激游標變化,不刺激感知組件更新,性能比游標方式高很多
Data.each(callback)函數參數callback是遍歷的回調函數,執行時給定的this是行對象
callback = function(param){
param.data;//遍歷的data對象
param.row;//遍歷到的行對象
param.index;//行的索引
param.cancel;//是否結束遍歷,當修改cancel為true時結束遍歷
}
全數據each遍歷代碼實例:
var data = this.comp('fruitData');
var names = [];
data.each(function(param){
names.push(param.row.val('fName'));
});
alert(names);
Data組件上還提供了一個函數eachAll,這個函數主要用于遍歷從Data所有數據,在主從情況下的從Data上使用each遍歷數據行只能遍歷到和當前主數據相關的從數據行,eachAll的使用和each一致這里就不再介紹了。
關于數據查找Data組件提供了find函數來支持
find函數參數:
cols:列名列表
values:值列表
first: 是否只是返回第一條,即查找到第一條符合條件的數據就返回,默認值:false
caseInsensitive: 匹配時忽略大小寫,默認值:false
partialKey: 模糊匹配,即數據中包含需要匹配字符就算匹配成功,默認值:false
all: data所有數據查找,當是從Data時all==false只查找和主關聯的行數據,默認值:false
find函數根據cols和values匹配查找返回符合行數組,當沒有匹配數據時返回[]數組,如:cols=[‘fName’],value=[‘蘋果’]查找的就是Row.val(‘fName’)===’蘋果’的行
數據查找代碼實例:
//查找fID中包含"E"或者"e"的第一條數據
var rows = this.comp('fruitData').find(['fID'],['e'],true,true,true);
if(rows.length<=0) alert('沒有符合條件數據');
else alert(rows[0].val('fName'));
//查找fName="蘋果",fWeight=100的數據
var rows = this.comp('fruitData').find(['fName','fWeight'],['蘋果',100]);
if(rows.length==0) alert('沒有符合條件數據');
當有其他數據查找需求時可以使用each函數實現
**三、聚合運算**
Data組件上提供了常用的統計函數,count、sum、avg、min、max這些函數都是基于前端data數據的,沒有加載到前端data中的數據不包括在計算中,注:返回的數值精度受js的number精度影響
這些函數使用都很簡單,所有函數上都有一個filterCallback參數,可以傳入過濾數據的回調方法,filterCallback需要返回boolean,為true時行有效,回調函數給出參數event,{‘data':data對象,row:行},當沒有給出filterCallback參數時統計data的全部數據
前端統計函數代碼實例:
//統計mainData中記錄數
var count = this.comp('mainData').count();
//統計mainData中fName姓“李”的記錄數
var count = this.comp('mainData').count(function(ev){
var v = ev.data.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
//統計mainData中年齡fAge合計
var sum = this.comp('mainData').sum('fAge');
//統計mainData中fName姓“李”的年齡fAge合計
var sum = this.comp('mainData').sum('fAge',function(ev){
var v = ev.data.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
//統計mainData中年齡fAge平均值
var avg = this.comp('mainData').avg('fAge');
//統計mainData中fName姓“李”的年齡fAge平均值
var avg = this.comp('mainData').avg('fAge',function(ev){
var v = ev.data.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
//統計mainData中年齡fAge最小值
var min = this.comp('mainData').min('fAge');
//統計mainData中fName姓“李”的年齡fAge最小值
var avg = this.comp('mainData').min('fAge',function(ev){
var v = ev.data.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
//統計mainData中年齡fAge最大值
var min = this.comp('mainData').max('fAge');
//統計mainData中fName姓“李”的年齡fAge最大值
var avg = this.comp('mainData').max('fAge',function(ev){
var v = ev.data.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
除了前端的統計函數,Data組件也支持有后端提供統計結果,通過Data組件刷新時返回后端統計結果,統計值使用userdata方式返回(關于userdata將在第四節介紹)
data組件提供Data.getAggregateValue(name)獲取后端返回統計值,name為統計值定義的名稱
案例展示(DataTables組件footer顯示前后臺統計結果,注意:案例中使用的是BizData)
[](https://box.kancloud.cn/2015-09-23_560181fe69911.png)[](https://box.kancloud.cn/2015-09-23_560181feca6cf.png)[](https://box.kancloud.cn/2015-09-23_560181ff37a93.png)
運行效果:
[](https://box.kancloud.cn/2015-09-23_560181ff94942.png)
**四、擴展數據**
Data組件不光可以加載行列數據,同時也提供了加載擴展數據的能力,這就是data組件userdada擴展數據的機制。在data組件加載的數據上增加userdata數據,
json數據格式如下:
{
"@type" : "table",
"rows" : [...],
"userdata" : {
"DEMO_TABLE1Count" : 148
}
}
同時提供了相關的API:
Data.getUserData(name,row);—————-獲取擴展數據,name為擴展數據的名稱,row為指定的行,當沒有指定row時為data的擴展數據
Data.setUserData(name,value,row);———-設置擴展數據
上面介紹的后端統計就是通過這個機制實現的
- 快速入門
- 第一個應用
- WeX5產品能力和技術
- wex5技術理念
- WeX5可以怎么玩?
- WeX5和BeX5比較
- UI2開發
- UI2前端框架基礎01:應用和頁面
- UI2框架基礎02:框架結構圖和目錄
- 組建基礎
- 編程基礎
- js引用
- css、text引用
- 設置資源依賴
- 代碼調試
- 數據組件
- Data組件基礎01:列、初始化加載狀態、行對象和游標
- Data組件基礎02:規則、數據遍歷查找
- Data組件基礎03:CRUD
- Data組件基礎04:Tree、主從數據、更新模式
- Data組件基礎05:再談Data組件新增,查詢,保存
- Data組件的JSON數據格式
- WeX5 & BeX5 頁面框架核心之數據綁定
- 數據綁定屬性系列
- 初識綁定
- visible綁定
- text綁定
- html綁定
- css綁定
- 頁面布局
- 頁面樣式
- 樣式基礎
- 添加自定義圖標(iconfont)
- 常用組件
- bar組件
- contents組件
- 前端路由和頁面跳轉
- 路由模塊
- 頁面跳轉
- 部署和發布
- 三種部署方式
- Web app部署
- UIServer的緩存機制
- 自定義組件開發
- 組件運行時開發案例
- 組件設計時開發案例
- 組件設計時開發參考
- 屬性編輯器配置和開發
- 自定義向導開發(waiting)
- 第三方庫集成
- 集成Echarts
- 集成百度和高德地圖
- App開發
- 打包
- App打包基礎和常見問題
- App打包原理和目錄結構
- App打包過程詳解
- App打包服務器環境搭建
- 蘋果證書申請 使用
- Android和IOS的本地應用圖標規范
- Android和IOS的本地App如何安裝(apk&ipa)
- 蘋果App部署HTTPS進行在線下載安裝
- 調試
- Android和IOS真機調試
- 插件
- 如何使用和擴展cordova插件
- cordova插件開發
- 常用cordovar插件
- SQLite插件
- 極光推送(JPush)插件
- 微信支付入門教程
- 微信、支付寶支付開發
- 服務端開發
- App與服務端交互原理
- 輕量級Baas(視頻)(文字) (.net版)
- Data組件的JSON數據格式11
- 微信服務號集成(視頻)
- 擴展學習資料
- bootstrap
- Knockoutjs
- JQuery
- requirejs
- phonegap/cordova