XTemplate - 網頁數據綁定組件

jopen 9年前發布 | 25K 次閱讀 JavaScript開發

XTemplate是一個javascript組件,主要是用于完成html頁面上數據的綁定。常用的方式是用ajax從遠程讀取數據,XTemplate會將這些數據按規則綁定到頁面的dom上去。它支持兩種絆綁定方式,綁定數組和綁定對象。簡單的說一個用于顯示列表,另一個用于顯示一般內容。

單變量綁定

是以html中data-bind標記為綁定對象,只要data-bind的內容和綁定的變量同名,即會自動賦值。

例如:

<p data-bind='title'></p>

這時如果有一個變量為如下結構{title:'hello world'},那么,這個name為title的p標簽就會顯示hello world。

最終會生成

<p data-bind='title'>hello world</p>

使用方法參見示例:

1.普通綁定:輸出到p的默認內容中,此處為innerHTML屬性。一般img將輸出到src,input輸出到value,其它輸出到innerHTML。

<p data-bind="content"></p>

2.原始值按html輸出:

<p data-bind="content" data-bind-to="innerHTML"></p> 或 <p data-bind="content" data-bind-to="innerHTML">{!content}</p> 第1種為簡寫,第2種為data-bind-to的標準寫法

3.data-bind-to使用:

<b data-bind="market_product_id" data-bind-to="title" title="{!content}">title</b> data-bind-to指定了輸出的屬性,所以將綁定的內容將按data-bind-to進行綁定。此處data-bind-to為title,
待綁定的屬性內容要使用模板。
所以XTemplate將會把market_product_id的值綁定到title屬性上。
此處模板內content前有個嘆號“!”,代表輸出原始值,不進行html轉義。

4.模板輸出:必須使用data-bind-to指定屬性名,默認的輸出屬性值不會當作模板。

<p data-bind="content" data-bind-to="innerHTML"><b>{content|default,'沒有內容顯示'}</b></p> content的內容會以內部html為模板綁定后顯示

如果content為空,最終輸出 <p data-bind="content" data-bind-to="innerHTML"><b>沒有內容顯示</b></p> 如果剛開始不想顯示出模板的內容,可以將p設置為隱藏 <p style="display:none" data-bind-to="innerHTML" data-bind="content"><b>{content|default,'沒有內容顯示'}</b></p> 或 <p class="hide" data-bind-to="innerHTML" data-bind="content"><b>{content|default,'沒有內容顯示'}</b></p> 綁定后style.display將被重置為空,css中的hide也會被移除。

5.img的src綁定:

<img data-bind="thumb"/> 最終輸出<img data-bind="thumb" src="圖片地址"/> 指定img的默認顯示圖片,直接使用原來的src指定默認圖 <img data-bind="imgsrc" data-bind-src='/{imgsrc}/abc.jpg' src='默認圖'/> 如果img的地址比較復雜,是組合而成,或是需要用函數,可以使用data-bind-src來指定src的模板。 <img data-bind="thumb" data-bind-src="{thumb1|default,'logo.jpg'}"/> 注意不要用src屬性!!!

不使用data-bind-to指定src,是因為如果指定img的src,將會使瀏覽器多產生一個無效的http請求,影響加載效果。

錯誤的例子:<img data-bind="thumb" data-bind-to="src" src='/{imgsrc}/abc.jpg'> /{imgsrc}/abc.jpg這個地址是不存在的地方,所以會引起一個錯誤的http請求。

數組綁定

數組綁定是指定一個模板,并把數組的內容循環,按模板格式化后返回多行html。

例如:

 <ul data-repeat-name='listdata'> <li>{title}</li> </ul>

這里定義了一個名為listdata的模板,ul的內部html將成為可循環的模板,即

 <li>{title}</li>

為待循環的內容

我們綁定以下變量[{title:'hello 0'},{title:'hello 1'}]

最終會生成

<ul data-repeat-name='listdata'> <li>hello 0</li> <li>hello 1</li> </ul>

使用方法參見示例:

1.普通輸出:

 <ul data-repeat-name='data'> <li>{market_product_id}:{product_name}</li> </ul>

2.img的src綁定:

 <ul data-repeat-name='data'> <li><img data-bind-src='{thumb}'/>{market_product_id}:{!content}</li> </ul> 這里與單變量綁定不同的是沒有使用data-bind指定綁定的屬性,其它使用方法完全一致。

模板的使用

模板的基本語法是{模板內容},兩端以大括號包圍,中間為模板的內容。

如:{username},即輸出變量username的內容。

模板可以在循環的模板中使用,也可以在待綁定屬性中使用,也可以在data-bind-src中使用。

使用方法參見示例:

1.使用內部函數處理輸出結果:

{market_product_num|repeat,'*'}//最終輸出market_product_num個*,repeat為內部函數 語法為:[屬性名]|[函數]|[函數] 屬性名后豎線"|"連接函數名,當前的屬性必須為函數的第1個參數。 多個函數時依次用豎線連接,前一個函數作為后一個函數的第一個變量輸入。 如:{user_money|format_money},其中user_money為綁定屬性名,format_money為內部函數名,主要作用為格式化貨幣。 如果函數有多個參數,使用逗號連接。

2.使用外部函數處理輸出結果:

{market_product_id|#hello,':)'} 函數名前加了#號,代表使用外部函數,此處使用了hello,該函數使用前一定要定義。 此處market_product_id的值會傳給s變量,即第1個變量。 示例1: function hello(s){ return s+' hello'; } 示例2: function hello(s,v){ return s+'hello'+v; }

3.使用多個函數處理輸出結果:

{market_product_id|repeat,'@@'|#hello,':)'} 用|連接即可。

4.使用外部變量:

{id}={#out_abc} 變量前加#

5.進行簡單的運算:

{market_product_id * 3 + 12} 在模板中,屬性名支持簡單的加減乘除運算,復雜的請使用自定義函數處理。

6.在模板中處理子循環:

{list|range,'ID:(id)&nbsp; '} 使用內部函數range,參數為模板內容。但為了區分子模板和主模板,子模板使用小括號“()”代替大括號。

特殊語法:

!號的使用

在模板中使用,例如{!title},輸出title的值,以沒有!的區別,這里不會把html進行編碼,會輸出原始的html。

#號的使用

在函數名中使用,如果在函數名前加#,則指定這個函數為全局函數,這時這個函數必須是已經定義好的全局函數或是javascript的內部函數。 在變量名中使用,如果果變量名前加#,則指定這個變量為全局變量,這時這個變量必須是已經定義好的全局變量。

官方網站:http://www.baiduhome.net/lib/view/home/1451808197776


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!