Backbone.js с Eco Templates: как включить шаблон в шаблон?

Можно ли включить шаблон в шаблон? Может быть, что-то похожее на то, как ERB обрабатывает партиалы?

Вместо того, чтобы пытаться визуализировать вложенные модели в стиле ERB, лучше позволить Backbone.js позаботиться об этом.

Обратите внимание, я использую синтаксис coffeescript:

Проекты.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()

модельный проект имеет вложенную коллекцию, называемую сеансами:

Проекты.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() ))

Итак, в итоге у нас есть такие вложенные шаблоны:

  • Projects Index
    • Project
      • Session
      • Сессия
      • Сессия
      • Сессия
    • Project
      • Session
    • Project
      • Session
      • Сессия

person miketucker    schedule 13.09.2011    source источник


Ответы (3)


вот небольшой помощник, который я использую для позвоночника:

# 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>"
person twetzel    schedule 21.06.2012

Я не думаю, что Эко поддерживает это. Он предназначен скорее как простая система шаблонов, такая как Mustache, чем как полноценная замена ERB. В Rails вы, вероятно, отрендерите шаблон Eco и вставите вывод в шаблон ERB или Haml.

Для разработки Node.js вы можете взглянуть на CoffeeKup, который позволяет создавать шаблоны в CoffeeScript и поддерживает частичные.

person Trevor Burnham    schedule 13.09.2011
comment
Спасибо, я использую Eco с Backbone и Rails 3.1. Закончилось тем, что мы использовали магистраль для внедрения отдельных шаблонов в родителей. - person miketucker; 13.09.2011

Если вы поставите перед шаблоном префикс .erb, вы сможете использовать процессор ERB.

Измените yourfile.js.coffee на yourfile.js.coffee.erb, после чего вы сможете добавить теги <%= %> в свой шаблон CoffeeScript.

person Simone Carletti    schedule 13.09.2011
comment
это будет внутри Eco, так что вы предлагаете сделать file.jst.eco.erb? - person miketucker; 13.09.2011
comment
Чем больше расширений вы добавите, тем больше процессоров будет использовано. - person Simone Carletti; 13.09.2011
comment
Кроме того, поскольку ECO и ERB используют <%= %>, ERB проглотит все интерполяции до того, как ECO доберется до них! :) - person micapam; 29.05.2013