Backbone.js - Coffeescript расширяется - PullRequest
18 голосов
/ 02 ноября 2011

В этой статье я создаю цепочку выделений с помощью 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"

СтраныПоказать класс:

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

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

Ответы [ 2 ]

35 голосов
/ 02 ноября 2011

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

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

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

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

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

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

##= require ./locations_view

Удачи

4 голосов
/ 05 января 2013

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

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

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

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

...