变量传递Backbone模板

时间:2015-02-14 18:52:27

标签: backbone.js underscore.js

我刚开始学习'Backbone.js',我目前正在关注this视频教程。对于模板,我只是让我的模板像这样简单 -

<script type="text/template" id="songlist_template">
<%_.each(songs, function(song){});  %>
<h1>Loaded</h1>
</script>    

我的观点扩展为 -

var SongList=Backbone.View.extend({
el:'.page',
render: function(){
    var that=this;
    var songs=new Songs();
    songs.fetch({
        success:function (){
            var temp=_.template($("#songlist_template").html());
            var html=temp(songs);
            that.$el.html(html);
            },
        error: function (collection, response, options) {
            alert("error!! "+response.responseText); 
            }})
}});

一切都很完美,直到我到达模板部分,其中控制台日志表示 -

Uncaught ReferenceError: songs is not defined is not defined.

根据documentation,我认为我的模板语法没问题,我已经传递了正确的获取的数据。此外,我还定义了变量歌曲。如果有人可以指出我的错误,将会很有帮助。

完整代码here和json文件here

2 个答案:

答案 0 :(得分:0)

修复你的问题将歌曲传递为数组 temp({songs:songs.models})

成功回调你可以添加参数歌曲

  success:function (songs){
            var temp=_.template($("#songlist_template").html());
            var html=temp({songs:songs.models});
            that.$el.html(html);
            },

http://backbonejs.org/#Collection-fetch

  

options hash取得成功和错误回调,它们都将作为参数传递(集合,响应,选项)

答案 1 :(得分:0)

来自Underscore template的文档:

  

评估模板函数时,传入一个对应于模板自由变量

属性的数据对象

(强调我的)

@VladuIonut试图 - 正确 - 解释的是你必须传入一个包含你在模板中引用的属性的对象。

如果您的歌曲集合中没有一个名为songs的属性供该模板使用,则会因此未定义的ReferenceError而失败。

您的模板调用应如下所示:

var html=temp({
    "songs": songs
});