【问题标题】:BackboneJS Display multiple collections in one <ul>-ElementBackboneJS 在一个 <ul> 元素中显示多个集合
【发布时间】:2014-05-15 11:39:33
【问题描述】:

我想知道是否可以在一个&lt;ul&gt;-element 中显示多个集合?

例如,当我有多个视图时,在每个视图中我都有一个这样的集合:

Collection = Backbone.Collection.extend({
    url: function() {
        return '/path/to/JSON/file';
    }
});

现在我想在同一个 &lt;ul&gt;-element 中显示所有集合,以便在我的前端它会给我输出

<ul>
   <li>Data from Collection 1</li>
   <li>Data from Collection 1</li>
   <li>Data from Collection 2</li>
   <li>Data from Collection 2</li>
   <li>Data from Collection 3</li>
   <li>Data from Collection 3</li>
</ul>

这可能吗?如果是那怎么办?

提前谢谢...

[编辑]

好的,所以在我的 mainView 中我有:

Artist.View = Backbone.View.extend({
    template: 'artistchannel',
    beforeRender: function() {

      var artistinstagramCollection = new ArtistInstagram.ArtistInstagramCollection();
      artistinstagramCollection.artist_id = this.artist_id;
      this.insertView('.socialMedia', new ArtistInstagram.View({collection:artistinstagramCollection}));
      artistinstagramCollection.fetch();

      var artisttwitterCollection = new ArtistTwitter.ArtistTwitterCollection();
      artisttwitterCollection.artist_id = this.artist_id;
      this.insertView('.socialMedia', new ArtistTwitter.View({collection: artisttwitterCollection}));
      artisttwitterCollection.fetch();

      var artistfacebookCollection = new ArtistFacebook.ArtistFacebookCollection();
      artistfacebookCollection.artist_id = this.artist_id;
      this.insertView('.socialMedia', new ArtistFacebook.View({collection: artistfacebookCollection}));
      artistfacebookCollection.fetch();

如前所述,每个 Collection 都绑定到自己的视图:

function (App, Backbone) {

    var ArtistInstagram = App.module();

    ArtistInstagram.View = Backbone.View.extend({
        tagName: 'li',
        template: 'instagram',
        initialize: function() {
            this.listenTo(this.collection, 'all', this.render)
        },
        serialize: function() {
            return this.collection ? this.collection.toJSON() : [];
        }
    });
    ArtistInstagram.ArtistInstagramCollection = Backbone.Collection.extend({
        url: function() {
            return '/myproject/index.php/api/social_feeds/instagram/' + this.artist_id;
        }
    });

    return ArtistInstagram;
}

以上同样适用于 Twitter 和 Facebook。所以我有 3 个模块。

然后在模板artistchannel 中有一个部分我有:

<div class="socialMediaDiv">
    <ul class="socialMedia"></ul>
 </div>

我的 HandlebarsJS-HTML 模板看起来像:

{{#each this}}
<li>
<a href="{{link}}" target="_blank"><img src="{{title}}" /></a>
<section class="ip">
    <p>{{description}}</p>
    <h3>
        <time class="timeago" datetime="{{pubDate}}"></time>
        {{type}}
    </h3>
</section>
</li>
{{/each}}

当我这样做时,它会生成 3 个&lt;li&gt;-elements,所以结构如下:

<ul>
   <li>
      <li>some results from collection 1</li>
      <li>...</li>
      <li>...</li>
      <li>...</li>
   </li>
   <li>
      <li>some results from collection 2</li>
      <li>...</li>
      <li>...</li>
      <li>...</li>
   </li>
   <li>
      <li>some results from collection 3</li>
      <li>...</li>
      <li>...</li>
      <li>...</li>
   </li>
</ul>

我做错了什么??

顺便说一下,我用的是主干的layoutmanager

【问题讨论】:

    标签: backbone.js handlebars.js backbone-layout-manager


    【解决方案1】:

    这当然是可能的。渲染集合视图时,只需附加到容器元素(el$el),而不是替换其 html。

    【讨论】:

    • 嗯,我在每个视图中都有 tagName: 'ul'template: 'sometemplate'。所以我将集合附加到特定的模板而不是特定的el,所以如果我的容器元素是&lt;div id="container"&gt;,我应该执行this.$el.append('#container') 之类的操作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多