iT邦幫忙

DAY 29
1

建立API為中心的輕量級網站系列 第 29

knockout.js 的 template 功能

用template的方式來顯示資料,
knockout.js有幾種的作法,
看看可怎麼使用。
使用命名的樣板
用 id 來指定 template 的名稱,
也要在 template 的區塊裡,
加上 type="text/html" 免得被當作javascript執行,
此例是用了兩次的 person-template 的樣板。

<h2>參賽者</h2>
兩名參賽者:
<div data-bind="template: { name: 'person-template', data: one }"></div>
<div data-bind="template: { name: 'person-template', data: two }"></div>

<script type="text/html" id="person-template">
    <h3 data-bind="text: username"></h3>
    <p>主題:<span data-bind="text: subject"></span></p>
</script>

<script src="/js/knockout.js" type="text/javascript"></script>
<script src="/data.js" type="text/javascript"></script>
<script type="text/javascript">
  var viewModel = function(){
    var self = this;
    self.one = i5data[0];
    self.two = i5data[1];
  };

  ko.applyBindings(new viewModel());
</script>

http://i5.tagbible.net/temp1.html

用foreach使用命名的樣板
用迴圈的方式透過樣板顯示內容,
只要把上述的3,4兩行用這一行取代即可:

<div data-bind="template: { name: 'person-template', foreach: players}"></div>

http://i5.tagbible.net/temp2.html

用as來做foreach裡元素的別名
這較適合用在較多階層的資料型態。

    <meta charset="UTF-8" />
    <title>鐵人五</title>
<script src="/js/knockout.js" type="text/javascript"></script>


<ul data-bind="template: { name: 'seasonTemplate', foreach: seasons, as: 'season' }"></ul>

<script type="text/html" id="seasonTemplate">
    <li>
        <strong data-bind="text: name"></strong>
        <ul data-bind="template: { name: 'monthTemplate', foreach: months, as: 'month' }"></ul>
    </li>
</script>

<script type="text/html" id="monthTemplate">
    <li>
        <span data-bind="text: month"></span>
        is in
        <span data-bind="text: season.name"></span>
    </li>
</script>

<script>
    var viewModel = function() {
        self.title = 'hi';
        self.seasons = ko.observableArray([
            { name: 'Spring', months: [ 'March', 'April', 'May' ] },
            { name: 'Summer', months: [ 'June', 'July', 'August' ] },
            { name: 'Autumn', months: [ 'September', 'October', 'November' ] },
            { name: 'Winter', months: [ 'December', 'January', 'February' ] }
        ])
    };
    ko.applyBindings(new viewModel());
</script>

這 as 的功能要在 knockout-2.2.0.js 才有效,
如果是之前的版本,19,21行
要改成這樣才能運作:

<span data-bind="text: $data"></span>
<span data-bind="text: $parent.name"></span>

http://i5.tagbible.net/b3.html

系列文章列表


上一篇
knockout.js 自行產生新的綁定
下一篇
待完成的相關議題
系列文
建立API為中心的輕量級網站30

尚未有邦友留言

立即登入留言