在Backbone + Marionette + Rails的第三张唱片上有不同的造型

时间:2013-07-08 18:07:25

标签: ruby-on-rails backbone.js underscore.js marionette backbone-views

我决定进入Backbone竞技场&在搜索了BB& Marionette的医生,我在看似简单的事情上遇到了一些麻烦。

我只是想自定义第三条记录上显示的内容。

以下是我只使用Rails

的方法
    <% @posts.each_with_index do |post, i| %>
      <% if i == 1 || i == 7 || i == 14 %><!-- 1st, 7th, & 14th record -->
        display title, description & something else
      <% else %><!-- other records -->
        display only title
      <% end %>
    <% end %>

使用Backbone + Marionette + Underscore,以下是我的记录显示方式: 的控制器

        postsRegion: (posts) ->
            postsView = @getPostsView posts

            postsView.on "childview:posts:post:clicked", (child, post) ->
                App.vent.trigger "posts:post:clicked", post

            @layout.postsRegion.show postsView

        getPostsView: (posts) ->
            new List.Posts
                collection: posts

查看

   class List.Post extends App.Views.ItemView
        template: "posts/list/_post"
        tagName: "li"
        className: "span4 item"

        events:
            "click" : -> @trigger "posts:post:clicked", @model

如何制作第1版,第7版和第1版第14(或只是第三)记录显示不同的东西?另外,作为设计师的更多人,是否有人可以使用此js库建议任何有关视图的进一步读数?

2 个答案:

答案 0 :(得分:1)

您可能会遇到此类行为的问题:Marionette集合视图为集合中的每个模型呈现项目视图。反过来,这些项目视图仅根据模型中的数据调整显示的内容(即渲染的模板)。

如果你想突出显示每个第7项,我会看到以下选项:

  • 将jQuery / javascript代码添加到onRender方法以设置这些行的样式(最简单,但可能会对大型集合产生性能影响)
  • 如果渲染视图的数量(通过jQuery选择器获取)可以被7整除(参见https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md#collectionviews-appendhtml),或者使用外部计数器,则重写集合/复合视图的appendHtml以设置元素的样式(例如在视图上定义)
  • 定义您自己的视图以接收集合,为每个项目呈现子视图并将其附加到DOM(基本上使用普通的Backbone,并重新实现Marionette概念)

总而言之,你将面临一场艰苦的战斗,如果你可以使用模型属性进行造型,那么你的生活将会更容易。请注意,此模型属性不必保留在服务器上......

答案 1 :(得分:1)

在您的集合视图中,您应该能够根据索引将选项传递给项目视图,如下所示:

MyCollectionView = Backbone.Marionette.CollectionView.extend({
  itemView : MyItemView,
  itemViewOptions : function (model, index) {
    if (index % 3 == 0) {
      return { specialValue : "foo" };
    } else {
      return {};
    }
  }
};
MyItemView = Backbone.Marionette.ItemView.extend({
  onRender : function () {
    if (this.options.specialValue) {
      // DO SOMETHING SPECIAL
    }
  }
};

木偶文件实际上非常棒。有问题的函数可以是found here