为什么模板没有渲染?

时间:2011-02-04 22:53:59

标签: jquery jquery-templates knockout.js

我想知道为什么没有附加li

<! DOCTYPE html>
<html>
<head>
    <title>Trying out knockout</title>
    <script type="text/javascript" src="jquery-1.4.4.js"></script>
    <script type="text/javascript" src="jquery.tmpl.js"></script>
    <script type="text/javascript" src="knockout-1.1.2.debug.js"></script>      
    <script type="text/javascript">
        var viewModel ={
            personName:ko.observable('Stan Marsh'),         
            personAge:ko.observable(28),
            grades:[
                    {subject:"Math",grade:'A'},
                    {subject:"Physics",grade:'B'},
                    {subject:"Chemistry",grade:'A'},
                    {subject:"Biology",grade:'A'}
            ]           
        };      


    $(document).ready(function (){      
        // Apply knockout bindings
        ko.applyBindings(viewModel);
        // Apply templates          
        function renderList() {
          $("#tmplGrades").tmpl(viewModel.grades).append("#ulGradeList"); 
        };      
        // Event Wireup
        $('#btnViewChanges').click(function(){
        var message = "New Name:"+viewModel.personName()+" and New Age:"+ viewModel.personAge();
            alert(message);

        });

    });

    </script>
    <script id="tmplGrades" type="text/html">
    {{each viewModel.grades}}<li>Subject: ${subject} , Grade: ${grade}</li>
    </script>   
</head>
<body>
    <fieldset>
        <legend>Person</legend>
        <p>
            <label for="tbPersonName">Name:</label>
            <input type="text" id="tbPersonName" data-bind="value:personName" />
        </p>
        <p>
            <label for="tbAge">Age:</label>
            <input type="text" id="tbAge" data-bind="value:personAge" />
        </p>
        <input type="button" id="btnViewChanges" value="View Changes"/>
    </fieldset>
    <ul id="ulGradeList">

    </ul>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

$("#tmplGrades").tmpl(viewModel.grades).append("#ulGradeList"); 

我认为你的意思是appendTo而不是append

append将内容附加到所选元素,而appendTo将所选内容附加到选择器中指定的元素。

答案 1 :(得分:1)

以下是一个有效的示例:http://jsfiddle.net/rniemeyer/ztgfG/

在您的代码中,模板呈现在一个名为 renderList()的函数中,而这个函数没有被调用。此外,如果将数组传递给模板渲染,它将自动为数组中的每个项执行此操作,因此您不需要使用{{each}}。

JSFiddle上的示例还展示了如何使用模板绑定为您渲染模板。这样你根本不必进行.tmpl调用。

希望这有帮助。