數(shù)據(jù)綁定是使用填充數(shù)據(jù)(XCO對象),對綁定標記進行替換和頁面渲染。
設置綁定標記
<div> <p id="p1">用戶ID:#{id}</p> <p id="p2">用戶昵稱:#{name|'無名'}</p> <p id="p3">年齡層次:#{age@getAgeLevel}</p> <p id="p4">注冊時間:#{create_time@formatDateTime}</p> <p class="c2">@{getState}</p> </div>
XCO請求返回的填充數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <L K="id" V="185"/> <S K="name" V="張三"/> <I K="age" V="18"/> <I K="state" V="1"/> <A K="create_time" V="2017-08-05 15:23:58"/> <I K="$$CODE" V="0"/> </X>
方法調(diào)用
<script type="text/javascript" src="/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="/js/xco-1.0.1.js"></script>
<script type="text/javascript" src="/js/xco.jquery-1.0.1.js"></script>
<script type="text/javascript" src="/js/xco.variable-1.0.1.js"></script>
<script type="text/javascript" src="/js/xco.databinding-1.0.1.js"></script>
<script type="text/javascript">
var bindConfig = [ '#p1', '#p2', '#p3', '#p4', '.c2' ]; // 聲明綁定標記的容器
XCODataBind.pretreatment(bindConfig); // 對綁定標記進行預處理
function doBind() {
var xco = new XCO();
XCODataBind.bind({ // 綁定數(shù)據(jù)
url : "/m3.xco", // XCO請求的URL
extendedFunction : { // 函數(shù)容器對象
getState : function(xco){ // 對應函數(shù)替換標記中的函數(shù)
if(1 == xco.get('state')){
return '<b>已認證</b>';
} else {
return '<a href="/toCertify.jsp?id=' + xco.get('id') + '">去認證</a>';
}
}
}
});
}
function getAgeLevel(age){ // 變量替換之函數(shù)調(diào)用
if(age < 20){
return '青年';
}
return '中年';
}
</script>
渲染后的HTML
<div> <p id="p1">用戶ID:185</p> <p id="p2">用戶昵稱:張三</p> <p id="p3">年齡層次:青年</p> <p id="p4">注冊時間:2017-08-05 15:30:59</p> <p class="c2"><b>已認證</b></p> </div>
類庫說明
xco.variable-1.0.1.js
標記解析類庫xco.databinding-1.0.1.js
數(shù)據(jù)綁定類庫在使用數(shù)據(jù)綁定的時候,需要先聲明綁定標記的容器,比如:
var bindConfig = [ '#p1', '#p2', '#p3', '#p4', '.c2' ]; // 聲明綁定標記的容器
其中#p1
代表ID為p1
的HTML元素,.c2
標識CLASS為c2
的HTML元素;因為數(shù)據(jù)綁定中,HTML元素的查找是基于JQuery的,因此具體的查找表達式,可參考JQuery選擇器中的表達式。
數(shù)據(jù)綁定中的標記同樣支持變量標記和函數(shù)標記,具體的可參考模板引擎章節(jié)的內(nèi)容。
數(shù)據(jù)綁定不僅可以綁定HTML中的內(nèi)容,同樣可以綁定HTML元素的屬性。
設置綁定標記
<a id="p5" href="toCertify.jsp?id=#{id}">#{name}</a>
填充數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <L K="id" V="185"/> <S K="name" V="張三"/> </X>
方法調(diào)用
var bindConfig = [ {el : '#p5', attr: ['href', 'html']} ]; // 聲明綁定標記的容器 XCODataBind.pretreatment(bindConfig); // 對綁定標記進行預處理
var xco = new XCO(); XCODataBind.bind({ // 綁定數(shù)據(jù) url : "/m3.xco", // XCO請求的URL });
渲染后的HTML
<a id="p5" href="toCertify.jsp?id=185">張三</a>
說明
之前我們聲明一個綁定標記容器的時候,只需要一個ID或者CLASS即可,為什么這里需要如此復雜呢?其實這里的聲明,才是對于一個HTML元素完整的聲明,比如:
{el : '#p5', attr: ['href', 'html']}
其中el
代表該元素的查詢表達式,attr
代表綁定標記位于該元素的那些屬性中。之前的申明#p1
,只是一種簡化的方式,其完整的表示應該是:
{el : '#p1', attr: 'html'}
在一個頁面中,假設我們需要展示兩部分信息,一部分是用戶基本信息,一部分是用戶的資金信息,這兩部分的數(shù)據(jù)是分別獲取的。基于這種場景下,數(shù)據(jù)綁定引入了命名空間的概念。命名空間就是填充數(shù)據(jù)所對應的綁定標記的集合。下面我們看一個完整的示例。
設置綁定標記
<div> <p id="p1">用戶ID:#{id}</p> <p id="p2">用戶昵稱:#{name|'無名'}</p> <p id="p3">年齡層次:#{age@getAgeLevel}</p> <p id="p4">注冊時間:#{create_time@formatDateTime}</p> <p class="c2">@{getState}</p> <a id="p5" href="toCertify.jsp?id=#{id}">#{name}</a> </div>
<div> <p id="p6">用戶積分:#{xx:score}</p> <p id="p7">用戶資金:#{xx:(money/100)+'$'}</p> </div>
方法調(diào)用
var bindConfig = [ '#p1', '#p2', '#p3', '#p4', '.c2', {el : '#p5', attr: ['href', 'html']}, '#p6', '#p7']; XCODataBind.pretreatment(bindConfig); function doBind() { var xco = new XCO(); XCODataBind.bind({ // 綁定數(shù)據(jù) url : "/m3.xco", // XCO請求的URL extendedFunction : { // 函數(shù)容器對象 getState : function(xco){ // 對應函數(shù)替換標記中的函數(shù) if(1 == xco.get('state')){ return '<b>已認證</b>'; } else { return '<a href="/toCertify.jsp?id=' + xco.get('id') + '">去認證</a>'; } } } }); XCODataBind.bind({ ns : 'xx', url : "/m4.xco" }); }
XCO請求返回的填充數(shù)據(jù)
/m3.xco請求的返回結(jié)果:
<?xml version="1.0" encoding="UTF-8"?> <X> <L K="id" V="185"/> <S K="name" V="張三"/> <I K="age" V="18"/> <I K="state" V="1"/> <A K="create_time" V="2017-08-05 15:23:58"/> <I K="$$CODE" V="0"/> </X>
/m4.xco請求的返回結(jié)果:
<?xml version="1.0" encoding="UTF-8"?> <X> <L K="id" V="185"/> <L K="score" V="100"/> <L K="money" V="10000"/> <I K="$$CODE" V="0"/> </X>
渲染后的HTML
<div> <p id="p1">用戶ID:185</p> <p id="p2">用戶昵稱:張三</p> <p id="p3">年齡層次:青年</p> <p id="p4">注冊時間:2017-08-05 15:30:59</p> <p class="c2"><b>已認證</b></p> </div>
<div> <p id="p6">用戶積分:100</p> <p id="p7">用戶資金:100$</p> </div>
說明
在之前的示例中,我們在bind
的時候通過ns:'xx'
設置了命名空間,在綁定標記中通過#{xx:score}
使用了命名空間。其實,之前的示例中還隱含的存在另一個命名空間,一個空的命名空間,也就是默認的命名空間。在bind
的時候沒有明確指的ns
,將使用默認命名空間,在綁定標記中為通過前綴xx|
明確的指定命名空間也將使用默認的命名空間。
更多建議: