javascript - 列表的 Backbone subview

标签 javascript jquery backbone.js underscore.js underscore.js-templating

我很难理解 Backbone 的 subview ,我正在努力学习如何使用它们。

我想创建一个简单的无序列表,使用容器的主视图和每个列表项的 subview 。

这是我目前拥有的 fiddle :http://jsfiddle.net/LrZrJ/

这是我最终希望看到的 HTML:

<div class="js-container">
    <h3>Stat = ok</h3>
    <ul>
        <li>Hello world</li>
    </ul>
</div>

这是我的 JavaScript:

var TheModel = Backbone.Model.extend({
    default: {
        photos: '',
        stat: ''   
    }
});

var TheCollection = Backbone.Collection.extend({
    model: TheModel,

    url: 'http://api.flickr.com/services/rest/?page=1&api_key=a2978e5ce30c337e3b639172d3e1a0d1&tags=candy&method=flickr.photos.search&per_page=3&format=json&jsoncallback=?'

});

// The main view
var List = Backbone.View.extend({
    el: '.js-container',

    initialize: function () {
        this.collection = new TheCollection();

        this.item = new ListItem();

        return this;
    },

    render: function () {
        var self = this;

        this.collection.fetch({
            dataType: 'jsonp',
            success: function (data) {
                var listTemplate = _.template( $('#listContainer').html(), {
                    collection: self.collection.toJSON()
                });

                self.$el.html(listTemplate);
                self.$el.html( self.item.render() );
            }
        });

        return this;
    }

});

var ListItem = Backbone.View.extend({
    render: function () {
        var itemTemplate = _.template( $('#item').html(), {} );

        return itemTemplate;
    }

});

var myList= new List();
myList.render();

这是我的 HTML:

<script type="text/template" id="listContainer">
    <h3>Stat = <%- collection[0].stat %></h3>
    <ul>

    </ul>
</script>

<script type="text/template" id="item">
    <li>Hello world</li>
</script>

<div class="js-container">
</div>

最佳答案

你快到了。你在这里有两个问题:

self.$el.html(listTemplate);
self.$el.html( self.item.render() );

首先,jQuery 的 html function替换一切:

When .html() is used to set an element's content, any content that was in that element is completely replaced by the new content.

这意味着您的第二个 .html调用:

self.$el.html( self.item.render() );

覆盖第一个的所有内容。您可能想使用 append 相反,这只会添加 <li>无论你append到。您还需要 append<ul> , 而不是 self.$el ;主干包括一个方便的 this.$ 在 View 的 el 中搜索的功能:

$ (jQuery) view.$(selector)

[...] It's equivalent to running: view.$el.find(selector)

所以要找到<ul>并把 <li>在里面,你可以这样说:

self.$('ul').append(self.item.render())

当我在这里时, View 的 render 很常见至 return this然后调用者会 something.append(v.render().el)将 View 放到页面上。你可以使用 setElement 替换 subview 的 el用你的<li>来自模板:

var ListItem = Backbone.View.extend({
    render: function () {
        var itemTemplate = _.template( $('#item').html(), {} );
        this.setElement(itemTemplate);
        return this;
    }
});

然后 self.$('ul').append(self.item.render().el)在 parent 中。

演示:http://jsfiddle.net/ambiguous/JHV9w/1/

另一种方法是添加 tagName: 'li'ListItem这样 Backbone 就会创建一个 <li>作为该 View 的 el然后删除 <li>...</li>从模板。那会给你一个 ListItem像这样:

var ListItem = Backbone.View.extend({
    tagName: 'li',
    render: function () {
        var itemTemplate = _.template( $('#item').html(), {} );
        this.$el.html(itemTemplate);
        return this;
    }
});

和一个#item像这样的模板:

<script type="text/template" id="item">
    Hello world
</script>

这种结构 (IMO) 比您目前使用的结构更标准(但 Backbone 不是很固执己见,所以做对您有用的事情)。

演示:http://jsfiddle.net/ambiguous/DVFVT/

关于javascript - 列表的 Backbone subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22851914/

相关文章:

javascript - 如何在博客中提供缩放图像

javascript - 我如何从开始时间中减去结束时间而不在​​ Javascript 计时器中有负分钟数

jquery:创建隐藏元素+slideToggle

javascript - Mocha 测试与焦点相关的行为(Backbone/CoffeeScript 应用程序)

javascript - 哪些脚本加载器(AMD 或非 AMD)与 Backbone.js/Underscore 一起使用?

javascript - wordpress中的表单处理php文件放在哪里

javascript - Node.js module.exports 的用途是什么,你如何使用它?

javascript - jQuery - 好的部分?

javascript - jQuery $.ajax 函数有效,但简写函数如 $.get/$.getJSON 无效——使用 jQuery 1.7.2 和 Grails 2.1 以及 twitter bootstrap

javascript - 为什么 'without' 方法根据上下文返回不同的结果?