Зависимости файлов Javascript не разрешаются с порядком манифеста

В настоящее время я нахожусь в процессе реорганизации наших файлов Javascript/Coffeescript в нашем приложении Rails 4 с использованием это руководство. До этого, из-за моего невежества в конвейере ресурсов, у нас была большая часть нашего кода в одном гигантском файле coffeescript. Цель состоит в том, чтобы разбить этот гигантский файл на логически управляемые части.

Наше приложение использует некоторые общие классы для определения программных структур, таких как двусвязный список. Я хотел поместить это в отдельный файл, app/assets/javascripts/misc_classes.coffee:

### ***********************************###
### ******* General Classes ***********###
### ***********************************###

#single node for doubly linked list
class Node
  constructor: (data) ->
    @data = data
    prev = null
    next = null

#Doubly-linked list class, to be used for front-end destinations
#Details: https://en.wikipedia.org/wiki/Doubly_linked_list
class DoublyList
  constructor: () ->
    @length = 0 #length of the current list
    @head = null #first node of the list
    @tail = null #last node of the list
...

Остальной код нашего приложения находится в app/assets/javascripts/custom/trips.coffee. Код в trips.coffee использует класс двусвязного списка из другого файла javascript, описанного выше:

### ***********************************###
### ****** Custom Site Classes ********###
### ***********************************###

class Trip
  constructor: (id, editable) ->
    @id = id #trip_id
    @title = 'New Trip'
    @cities = 0 #number of citites in trip
    @countries = 0 #number of countries in trip
    @distance = 0 #distance in KM
    @days = 0 #duration of trip in days
    @destinations = new DoublyList()
...

Способ решения этой зависимость осуществляется через файл манифеста application.js.

Если вам нужно, чтобы какой-то конкретный код JavaScript оказался выше другого в объединенном файле, сначала укажите необходимый файл в манифесте. Обратите внимание, что семейство директив require предотвращает двойное включение файлов в вывод.

Итак, наш файл application.js выглядит так:

//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require jquery-ui/sortable
//= require jquery-ui/datepicker
//= require colorbox-rails
//= require jquery.readyselector
//= require turbolinks
//= require jquery.externalscript
//= require misc_classes
//= require_tree ./custom/.

Однако, когда я запускаю код, я получаю в консоли следующую ошибку: Uncaught ReferenceError: DoublyList is not defined

Почему это происходит? Согласно другим сообщениям здесь, похоже, я правильно написал файл манифеста. Я также могу убедиться, что оба файла включены в раздел сайтов <header> в правильном порядке.

Спасибо!


person CHawk    schedule 29.03.2016    source источник


Ответы (1)


Для всех, кто интересуется, проблема была из-за области видимости. В производственной среде все файлы были бы объединены в application.js, но в процессе разработки все они оставались отдельными файлами. Мне пришлось добавить класс в глобальное пространство имен, чтобы он работал:

### ***********************************###
### ******* General Classes ***********###
### ***********************************###

#single node for doubly linked list
class this.Node
  constructor: (data) ->
    @data = data
    prev = null
    next = null

#Doubly-linked list class, to be used for front-end destinations
#Details: https://en.wikipedia.org/wiki/Doubly_linked_list
class this.DoublyList
  constructor: () ->
    @length = 0 #length of the current list
    @head = null #first node of the list
    @tail = null #last node of the list

Кредиты на этот ответ

person CHawk    schedule 29.03.2016