Подтвердить что ты не робот

Backbone.js - Coffeescript расширяет

Я делаю выбор цепочки с помощью backbone.js в этой статье http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/, но при распространении классов возникают ошибки.

Итак, у меня есть класс LocationsView:

class Blog.Views.LocationsView extends Backbone.View
  events:
    "change": "changeSelected"

Класс CountryView:

class Blog.Views.CountriesView extends Blog.Views.LocationsView
  setSelectedId: (countryId) ->

Класс CitiesView:

class Blog.Views.CitiesView extends Blog.Views.LocationsView
  setSelectedId: (cityId) ->

Но когда код coffeescript скомпилирован в javascript, мои двойные расширенные классы выглядят так:

(function() {
  var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
    function ctor() { this.constructor = child; }
    ctor.prototype = parent.prototype;
cities_view.js:5 Uncaught TypeError: Cannot read property 'prototype' of undefined
    child.prototype = new ctor;
    child.__super__ = parent.prototype;
    return child;
  };
  Blog.Views.CitiesView = (function() {
    __extends(CitiesView, Blog.Views.LocationsView);
    function CitiesView() {
      CitiesView.__super__.constructor.apply(this, arguments);
    }
    CitiesView.prototype.setSelectedId = function(cityId) {};
    return CitiesView;
  })();
}).call(this);

И я получил ошибку:

Uncaught TypeError: Cannot read property 'prototype' of undefined    cities_view.js:5

Итак, где проблема и как ее исправить?

4b9b3361

Ответ 1

Поскольку вы используете ROR, правильно ли утверждать, что вы используете 3.1 с конвейером активов? Если вы не используете 3.1, эта информация может быть полезной, в зависимости от того, как вы делаете.

Конвейер активов в 3.1 приведет к тому, что ваши файлы js будут в алфавитном порядке, когда файлы находятся в одной папке.

Из-за этого city_view.js будет выполняться до places_view.js. Затем, когда CitiesView пытается определить себя, LocationsView еще не существует. (Но это меня немного смущает, потому что вы не должны использовать файлы .coffee вместо файлов .js?)

Вам нужно будет отключить порядок файлов в конвейере активов (управляемый с помощью комментариев), чтобы получить правильный файл... или изменить имена.

Другими словами, вы можете сказать Sprockets (вещь в RoR, которая управляет конвейром вашего актива), чтобы сначала потребовать другой файл.

В верхней части вашего cities_view.coffee файла вы можете добавить следующую строку:

##= require ./locations_view

Удачи.

Ответ 2

Как говорит @brian Genisio, его алфавитный порядок загрузки файлов в конвейере активов ROR, что проблема.

Я нашел полезным разместить все модели, которые наследуются от других в подкаталоге. Таким образом, ROR сначала загружает все файлы в родительский каталог, прежде чем загружать файлы в подкаталог. Это также кажется более логичным для читателя.

например. vehicle.js и car.js (где автомобиль расширяет автомобиль) в том же каталоге не будет работать, поскольку car.js загружается и запускается до vehicle.js и не может наследовать его.

Ввод car.js в подкаталог (например, vehicle_models/car.js) будет работать.