【问题标题】:Backbone + Underscore: Can't find Template Variable. + Howto correctly access Modelattributes?Backbone + Underscore:找不到模板变量。 + 如何正确访问模型属性?
【发布时间】:2012-05-26 21:27:30
【问题描述】:

我刚开始使用 Backbone,我的目标是一个简单的幻灯片应用程序。我有一个 REST 接口,其中

/slidecasts

为我提供所有可用演示文稿的列表。返回的 json 如下所示:

[
    {
        "name": "p75-barth.pdf", 
        "nr": 1, 
        "slideLinks": [
            "slides/0", 
            "slides/1",                
        ]
}]

如果我想访问单个演示文稿并获得例如第一张幻灯片,我可以简单地这样做:

slidecasts/1/slides

返回:

[
    {
        "content": null, 
        "imageLinks": [
            "images/1"
        ], 
        "nr": 0, 
        "title": null
    }
]

我想将演示文稿和幻灯片表示为主干模型。我还想要一个 Backbone 视图,它最后只显示幻灯片图像、标题、一些注释和一个前进/后退按钮。

这是我目前的代码:

$(function (){

    initModel();
    initCollection();
    initView();

    var testSlidecast = new Slidecast();
    testSlidecast.id=1;

    testSlide = new Slide();
    testSlide.id = 5;

    testSlidecast.Slide = testSlide;

    var slideView = new SlideView(({model: testSlidecast}));

})

function initView(){
    SlideView = Backbone.View.extend({
        el: $("#presentation"),
        initialize: function(){
            this.render();
            alert("asd")
        },
        render: function(){
            var variables = { presentation_name: "This is a Test-Slide-Name" };
            var template = _.template( $("#slide_template").html(), {} );
            this.el.html( template );
        }
    });
}

function initModel(){
    Slide = Backbone.Model.extend({
    });
}

function initCollection(){
    Slidecast = Backbone.Collection.extend({
      model: Slide,
      url: function(){
        return 'slidecasts/' + this.id + '/slides'
      }
    });
}

这适用于集合,但我真的不知道如何从那里获取单个幻灯片的信息。像 slidecast.slide("0") 这样的可能吗?

我的视图模板也有一些问题:

我的 html 看起来像这样:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <link href="style.css" rel="stylesheet"/>

    <script src="http://underscorejs.org/underscore-min.js" > </script>
    <script src="http://code.jquery.com/jquery-1.7.2.min.js" > </script>
    <script src="http://backbonejs.org/backbone-min.js" > </script>
    <script src="bscript.js" > </script>

    </head>
    <body>
        <div id="presentation"> </div>

    <script type="text/template" id="slide_template">
            <label>Presentation <%= presentation_name %>  </label>
            <img src="" id="slide_pic" />
            <input type="text" id="slide_content" value="asd" />
    </script>

    </body>

</html>

我不断收到错误消息,即我想传递给模板 *presentation_name* 的变量名未定义,尽管我已在视图中定义了变量。

【问题讨论】:

    标签: javascript backbone.js underscore.js backbone-views


    【解决方案1】:

    模板范围内的变量必须显式传递。模板不会自动访问视图范围内的变量。而不是:

    var template = _.template( $("#slide_template").html(), {} );
    

    试试

    var template = _.template( $("#slide_template").html(), variables);
    

    【讨论】:

    • 谢谢。你对我如何组织收藏/模型有意见吗?如何轻松访问单张幻灯片的属性?
    • 删除所有 initX 函数并在顶层定义您的 Backbone 构造函数。不要在您的集合上设置id,只在模型上设置,并且当您创建新的Model 实例时,最好将id 作为属性哈希的一部分传递。视图必须从 render 函数返回 this。使用模型填充集合,将模型数组作为第一个参数传递给构造函数。一般来说,在主干中,您几乎从不直接设置对象属性。它始终与构造函数或 get/set 一起使用。
    • 为什么我不应该在集合上设置一个 id?在我的例子中,collection-id 标记了演示文稿的 id,模型 id 标记了幻灯片编号。它们都必须单独定义?!
    • 嗯,是的,就您使用收藏的方式而言,它可以有一个 ID。通常,普通 REST 样式 API 中的集合没有 ID(/users、/posts、/pages 等)。通常模型具有 ID (/user/42),但根据您认为资源的不同,它可能会变得模棱两可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多