【问题标题】:Backbone.js with Eco Templates: How to include template within a template?带有生态模板的 Backbone.js:如何在模板中包含模板?
【发布时间】:2011-11-16 00:19:00
【问题描述】:

是否可以在模板中包含模板?也许类似于 ERB 处理部分的方式?

与其尝试以 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() ))

所以,最后我们有这样的嵌套模板:

  • 项目索引
    • 项目
      • 会话
      • 会话
      • 会话
      • 会话
    • 项目
      • 会话
    • 项目
      • 会话
      • 会话

【问题讨论】:

    标签: ruby-on-rails templates backbone.js coffeescript


    【解决方案1】:

    这里是我用于脊柱的小帮手:

    # 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>"
    

    【讨论】:

      【解决方案2】:

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

      对于 Node.js 开发,您可能需要查看 CoffeeKup,它可以让您在 CoffeeScript 中进行模板化并支持部分。

      【讨论】:

      • 谢谢,我正在使用带有 Backbone 和 Rails 3.1 的 Eco。最终使用主干在父母中注入单个模板。
      【解决方案3】:

      如果您在模板前面加上.erb,则可以使用ERB 处理器。

      yourfile.js.coffee 更改为yourfile.js.coffee.erb,然后您就可以将&lt;%= %&gt; 标签添加到您的CoffeeScript 模板中。

      【讨论】:

      • 这将在 Eco 中,所以你建议做 file.jst.eco.erb?
      • 附加的扩展越多,使用的处理器就越多。
      • 另外,由于 ECO 和 ERB 都使用&lt;%= %&gt;,ERB 会在 ECO 到达之前吞噬所有插值! :)
      猜你喜欢
      • 1970-01-01
      • 2016-05-27
      • 2012-11-03
      • 2015-09-13
      • 1970-01-01
      • 2014-12-19
      • 2012-08-15
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多