[toc]javascript
官方: http://www.cola-ui.com教程位置:http://www.cola-ui.com/guide/modelhtml
API: http://www.cola-ui.com/api/cola.html , http://legacy.cola-ui.com前端
組件地址:http://www.cola-ui.com/docs/buttonjava
源碼地址:https://github.com/Cola-Org/cola-uinode
以上內容都是經過cola-ui官網得到的資料,絕大多數的開發內容能夠參考cola-ui官網提供的API進行查閱
git
本文檔主要針對於camsi工程中用到的功能或特性,且可能不存在於cola-ui官網提供的API進行整理和說明github
一般要基於camsi工程在瀏覽器渲染出來的頁面由三個部分組成,例如:simple01.jade、M.js、simple01Model.js
ajax
Jade 是一個高性能的模板引擎,它深受 Haml影響,它是用 JavaScript 實現的,而且能夠供 [Node](http://nodejs.org/) 使用,你也能夠[在此試用](http://naltatis.github.io/jade-syntax-docs/),這裏推薦[Jade入門中文文檔](http://www.nooong.com/docs/jade_chinese.htm)
數據庫
extends /_page block body v-box flex-box .content(style="overflow: auto") c-table(bind="simple01s" dataType="Simple01") column(property="name") append scripts script(src="simple01Model.js") script(src="simple01.js")
dataType的值應該與Js中定義的dataType的值以及Model.js中定義的dataType的值相等api
不作描述
cola(function(model) { model.dataType($DataType.Simple01); model.describe("simple01s", { dataType : "Simple01", provider : { url : "controller/simple01Service/findPagination?from={{$from}}&limit={{$limit}}", pageSize : 10, sendJson : true, loadMode: 'manual' } }); model.set("title", "[(#{simple01})]"); model.action({ test : function() { cola.alert('test') } }); });
全部正規的操做包括事件都應該編寫在cola(function(model) { })
中,其中首先須要使用dataType定義當前Js中全部用到的DataType,使用model.describe
交互後臺數據到當前指定model,使用model.set("", "")
向model交互數據,頁面全部用到的事件方法應該存在於model.action({})
中。
由cola-ui定義的前端模型
var $DataType = { Simple01: { name: "Simple01", properties : { name : { caption : "[(#{name})]", dataType : "string" } } } };
caption
用來標誌當前字段的前端顯示文本,使用[(#{ })]
取到當前字段對應的當前語言的國際化翻譯。
在正常狀況下,dataType可能會被公用,而後每一個字段在每一個不一樣的地方顯示的文本標識不同,這時候可使用caption
屬性進行操做,例如:caption=ll.l("name")
前面提到在Js中國際化使用的是[(#{ })]
一般須要將當前日期字段進行格式化只須要下面代碼便可:
field(property="birthday") label c-datepicker(displayFormat="yyyy-MM-dd" inputFormat="yyyy-MM-dd")
將datatype類型爲Date的birthday字段的文本顯示和選擇的日期格式調整爲"yyyy-MM-dd"
咱們常常會把一些常規的數據作成枚舉值存放在數據庫,並把頁面的文本輸入框改變成爲下拉項
頁面元素
field(property="status") label c-dropdown(c-items="dictionary('10000')")
引入Js
script(src=basecodeCP + "controller/basecode/codeDetail/findCodeDetails?baseCodeIds=10000")
或者
script(src="controller/basecode/codeDetail/findCodeDetails?baseCodeIds=10000")
這樣頁面會去加載枚舉值代碼爲10000的對應status存放的id對應的文本顯示到當前字段,併爲當前字段提供下拉項
相似於備註,一般都是用文本框來顯示
fields.cols-1 field(property="remark") label c-textarea(rows="3")
首先定義當前字段獨佔一列,使用c-textarea(rows="3")
表名當前字段獨佔三列
正常場景並非表單中列出的全部的字段都是手動輸入的,好比ID,咱們可使用readOnly="true"
對每一個field進行只讀控制,也能夠將readOnly="true"
放在c-form屬性裏面來控制整個表單只讀
Jade
field(property="country" label c-dropdown(c-items="dictionary('CountryCode')" onSelectData="onCountrySelect") (property="province" caption=ll.l("province") c-readOnly="queryCondition.country != 'CHN'") label c-dropdown(c-items="provinces" textProperty="name" assignment="province=kind" onSelectData="onProvinceSel") field(property="city" caption=ll.l("city") c-readOnly="queryCondition.country != 'CHN'") label c-dropdown(c-items="cities" textProperty="name" assignment="city=kind" beforeOpen="beforeCityOpen" onSelectData="onCitySel") field(property="county" caption=ll.l("county") c-readOnly="queryCondition.country != 'CHN'") label c-dropdown(c-items="counties" textProperty="name" assignment="county=kind" beforeOpen="beforeCountyOpen")
引入數據字典
script(src="controller/basecode/codeDetail/findCodeDetails?baseCodeIds=CountryCode")
Js
cola(function(model) { model.describe("provinces", { provider: { url: "controller/basecode/codeDetail/findCachedCodeDetails", parameter: { baseCodeId: "Address", parentId: "NULL" } } }); model.set("title", "[(#{simple01})]"); model.set("queryCondition", {"country":"CHN"}); model.action({ beforeCityOpen: function () { var province = model.get("queryCondition.province"); $.ajax("controller/basecode/codeDetail/findCachedCodeDetails?baseCodeId=Address&parentId=" + province, { type: "get", async: false }).done(function (result) { if (result) { model.set("cities", result); } }); }, beforeCountyOpen: function () { var city = model.get("queryCondition.city"); $.ajax("controller/basecode/codeDetail/findCachedCodeDetails?baseCodeId=Address&parentId=" + city, { type: "get", async: false }).done(function (result) { if (result) { model.set("counties", result); } }); }, onProvinceSel: function (self, arg) { var queryCondition = model.get("queryCondition"); if(queryCondition.get("province") != arg.data.get("kind")){ queryCondition.set("city", ""); queryCondition.set("county", ""); } }, onCitySel: function (self, arg) { var queryCondition = model.get("queryCondition"); if(queryCondition.get("city") != arg.data.get("kind")){ queryCondition.set("county", ""); } }, onCountrySelect: function (self, arg) { var selectedItem = arg.data; if("CHN" != selectedItem.key) { model.get("queryCondition").set("province", ""); model.get("queryCondition").set("city", ""); model.get("queryCondition").set("county", ""); } } }); });
一般咱們都是在表單錄入數據,在表格中進行簡約展現,因此在表單中錄入的下拉枚舉值咱們須要在表格中使用的時候必須使用獲取到的枚舉值進行翻譯
column(property="status") template div(c-bind="translate('10000',$default)")
在對於處理一些簡單數據的時候咱們能夠不須要彈出一個複雜的編輯框對當前行的數據進行編輯處理,能夠直接在表格進行行內編輯
c-table(bind="simple01s" dataType="Simple01" readOnly="false")
在表單編輯咱們能夠去選擇一個下拉項作爲數據值,固然在表格行編輯也能夠
column(property="status") template(name="edit") c-dropdown(bind="$default" c-items="dictionary('10000')")
最後代碼整理爲
column(property="status") template(name="edit") c-dropdown(bind="$default" c-items="dictionary('10000')") template div(c-bind="translate('10000',$default)")
一般咱們須要在表格的最後一列添加一行操做列來處理當前行的數據
c-table(bind="simple in simple01s" dataType="Simple01") column(caption=ll.l("operation")) template div a.cell-link(c-onclick="view(simple)")=ll.l("view")
不少場景下,咱們的數據和數據都是有關聯關係,好比一本書對應書籍的出版社的詳細信息,這時候針對不一樣的書本信息聯動到出版社的詳細信息
由於此處是兩個表的關聯,因此須要定義兩個dataType
cModel.js
var $DataType = { A: { name: "A", properties : { name : { caption : "[(#{name})]", dataType : "string", } } }, B : { name : "B", properties : { name : { caption : "[(#{name})]", dataType : "string" } } } };
c.jade
c-table(bind="as" dataType="a") column(property="name") c-table(bind="as#.bs" dataType="b") column(property="name")
c.js
cola(function(model) { model.dataType($DataType.B); $DataType.A.properties.bs = { dataType: "B", aggregated: true, provider: { url: "controller/B/find", sendJson: true, parameter: { "name": "{{@name}}" } } } model.dataType($DataType.A); model.describe("as", { dataType : "A", provider : { url : "controller/C/findPagination?from={{$from}}&limit={{$limit}}", pageSize : 10, sendJson : true, loadMode: 'manual' } }); model.set("title", "[(#{C})]"); model.action({ }); });
在關聯中可使用parameter:{"name":"{{@name}}"}
方式拿到父表中當前選中行的name的值
在某些場景下咱們可讓表格數據直接加載到頁面,也可使用事件來觸發加載數據
loadMode: 'manual'
能夠經過loadMode來控制表單是否在頁面加載的時候加載數據到頁面:manual手工加載,註釋掉loadMode缺省自動加載數據
c-panel#panelDemo(caption=ll.l("panel")) template(name="tools") div c-button.primary(caption=ll.l("add") click="add")
一般咱們會在頁面加載完成的時候自動觸發一部分方法或者set一部分數據值到指定屬性
cola.ready(function() { cola.widget("panelDemo").collapse(); // 在加載完頁面以後 摺疊id爲panelDemo的面板 });
代碼應該放在cola(function (model) { })