在Backbone中渲染集合

时间:2012-10-17 19:08:59

标签: backbone.js

我有一个看起来像这样的模型

collection=
{
foo:[ [1,1], [2,2], [3,3] ] 
bar: [ [1,1], [2,2], [3,3] ] 
}

我通过这样做来渲染这个以在骨干中查看:

template: JST["backbone/templates/first"]
collection.each (data) ->
      foo = data.attributes.foo
      bar = data.attributes.bar
      for foos in foo
        view = new Traveltime.Views.ViewExtractTimeList(model: foos)
        $('ul.listcontainer').append(view.render().el)
      for bars in bar
        console.log perce
        view = new Traveltime.Views.ViewExtractPercentList(model: bars)
        $('ul.2ndlistcontainer').append(view.render().el)

模板第一:

<ul class="listcontainer">
</ul>

<ul class="2ndlistcontainer">
</ul>

然后我又有两个视图可以处理每个视图:

class App.Views.ViewExtractFoo extends Backbone.View

  tagName: "li"
  template: JST['backbone/templates/foo']

  render: ->
    $(@el).html(@template(content: @model))
    this


class App.Views.ViewExtractBar extends Backbone.View

  tagName: "li"
  template: JST['backbone/templates/bar']

  render: ->
    $(@el).html(@template(content: @model))
    this

模板看起来像这样(交换foo为bar为bar示例):

<li>
Foo: <%=content.attributes.foo%>
</li>   

现在这个有效,而且效果很好。但它感觉非常混乱。我在rails中使用骨干,所以有6个或更多不同的文件只需要一个JSON请求并呈现它。这感觉很讨厌,有更好的方法。我只是不确定它是哪一个。

我只是在想如果我在Rails中做到这一点,我可以有一个可以全力以赴的视图!?

我可以使用collection.each并以某种方式将嵌套集合传递给模板吗?

有点困在这里,我并不擅长这个,所以任何帮助都会受到极大的欢迎。

1 个答案:

答案 0 :(得分:0)

简化和统一模板和视图是一种选择。模板可以使用json对象,因此它们可以渲染数组,这非常适合渲染列表,就像你的情况一样。例如,您可以只使用一个ListView使用单个模板对任何列表执行实际呈现,然后在主视图中将此视图用于集合对象的两个属性。希望下一个示例能让您了解可以简化的位置和方式。

class ListView extends Backbone.View 
   tagName: 'ul'
   template: """
        {{#items}}
           <li>{{content}}</li>
        {{/items}}
    """
   render: ->
       @$el.html @template items: @options.items
       @

class MainView extends Backbone.View

    render: ->
        @$el.empty()
        for own subitems of @options.items
            @$el.append new ListView items: subitems
        @



# Example usage #
collection = 
    foo: [[1,1], [2,2], [3,3]] 
    bar: [[1,1], [2,2], [3,3]] 

$('body').append new MainView(items: collection).render().$el