2011-09-13 95 views
5

是否可以在模板中包含模板?也许类似于ERB处理偏好的方式?Backbone.js与生态模板:如何在模板中包含模板?

与其试图以像ERB这样的方式呈现嵌套模型,最好让Backbone.js处理此问题。

注意,我使用CoffeeScript的语法:

Projects.IndexView

template: JST["backbone/templates/projects/index"] 

addAll:() -> 
    @options.projects.each(@addOne) 

addOne: (project) -> 
    view = new Worktimer.Views.Projects.ProjectView({model : project}) 
    @$("#projects-table").append(view.render().el) 

render: -> 
    $(@el).html(@template(projects: @options.projects.toJSON())) 
    @addAll() 

模型项目已经嵌套集合称为会话:

Projects.ProjectView

template: JST["backbone/templates/projects/project"] 

$(@el).html(@template(@model.toJSON()))  
for s in @model.sessions.models 
    v = new Worktimer.Views.ProjectSessions.ShowView(model: s) 
    $(@el).find('.sessions').append(v.render().el) 

ProjectSessions.ShowView

template: JST["backbone/templates/project_sessions/show"] 

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

所以,最终我们嵌套模板是这样的:

  • 项目指标
    • 项目
      • 会议
      • 会议
      • 会议
      • 会议
    • 项目
      • 会议
    • 项目
      • 会议
      • 会议

回答

-1

如果以.erb作为模板的前缀,则可以使用ERB处理器。

更改yourfile.js.coffeeyourfile.js.coffee.erb,然后您就可以将<%= %>标记添加到您的CoffeeScript模板。

+0

这将是内生态,所以你建议做file.jst.eco.erb? – miketucker

+0

您追加的扩展名越多,将使用的处理器就越多。 –

+0

另外,由于ECO和ERB都使用'<%= %>',ERB会在ECO达到它之前吞噬所有插值! :) – micapam

0

我不认为生态支持这一点。它更像是一个简单的模板系统,比如Mustache,而不是一个完整的ERB替代品。在Rails上,您可能会渲染一个Eco模板并将输出注入ERB或Haml模板。

对于Node.js开发,您可能需要查看CoffeeKup,它允许您在CoffeeScript中执行模板并支持偏分量。

+0

谢谢,我用Backbone和Rails 3.1使用Eco。最终结合使用骨干向父母注入个人模板。 – miketucker

5

这里的小帮手我用脊柱:

# Render Partials in ECO-Templates like in Rails-ERB 
# 
# usefull to clean up structure in spine.js and other js-mvc´s like backbone 
# 
# usage: 
# <%- render_partial 'path/to/partial' %> .. will render ../spine-app/views/path/to/_partial.jst.eco 
# <%- render_partial 'path/to/partial', foo: 'bar' %> .. will render ../spine-app/views/path/to/_partial.jst.eco .. locals = @foo 
# 
window.render_partial = (path, options = {}) -> 
    # add the leading underscore (like rails-partials) 
    path = path.split('/') 
    path[ path.length - 1 ] = '_' + path[ path.length - 1 ] 
    path = path.join('/') 
    # render and return the partial if existing 
    try 
     JST["app/views/#{ path }"](options) 
    catch error 
     # if App.Environment != 'production' then "<p class='error'>Sorry, there is no partial named '#{ path }'.</p>" else '' 
     "<p class='error'>Sorry, there is no partial named '#{ path }'.</p>"