Каждая страница устанавливает свой класс для элемента body в зависимости от controller, action и layout. Например для страницы вывода заявок на БВ в админке это было бы
<body class="admin page-ownership_requests page-ownership_requests-index">
- app/
- coffeescripts/
- initializers/
admin.js
frontend.js
frontend_reviews.js
- widgets/
- chat/
- ownership/
- businesses/
binding.coffee
expandeable_list.coffee
- models/
- public/
- javascripts/
- app/
- lib/
Код, отвечающий за инициализацию виджетов на странице через поиск контейнеров и передачу их в конструкторы виджетов. При этом селекторы для контейнеров могут учитывать и body-класс. Для выполнения кода при наличие определенных контейнеров удобно использовать функцию each.
Масса этого кода разбита по файлам для удобства подключения на страницы (assets.yml или assets-pipeline). Пример:
$('body.frontend').each ->
$('.bo-request-business-select.widget').each (i, container)->
new Views.Ownership.BusinessSelect container,
afterBind ->
window.location = "/ownership/requests/#{@request_id}/edit"
$('body.admin').each ->
$('.bo-request-business-select.widget').each (i, container)->
new Views.Ownership.BusinessSelect container,
afterBind ->
window.location = "/admin/ownership_requests/#{@request_id}/edit"
Виджет - класс, принимаютщий в конструктор некоторый DOM-елемент (контейнер) и опции. Он навешивает обработчики событий, добавляет элементы, обрабатывает шаблоны, работает с моделями. Виджет завязан на верстку содержимого контейнера, поэтому, чтобы обозначить блоки, с которыми работают виджеты необходимо использовать класс widget
# Поиск и привязка бизнеса к заявке
#
# Container attributes:
# business_id - идентификатор бизнеса к которому привязывается бизнес.
class Widgets.Ownership.BusinessSelect
constructor(@container, options) ->
@request_id = @container.data("request_id")