2011-11-02 12 views
18

Tworzę łańcuchy wybiera z backbone.js przez ten artykuł http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/, ale dostałem błędy, podczas rozszerzania klas.Backbone.js - Coffeescript rozszerza

Tak, mam klasę LocationsView:

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

klasa CountriesView: Klasa

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

CitiesView:

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

Ale kiedy coffeescript kod skompilowany do JavaScript moich podwójnych rozszerzonych klas wygląd podobne:

(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); 

i mam błąd:

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

Więc gdzie jest problem i jak go rozwiązać?

+0

Czy możesz podać pełny ślad stosu? – thejh

Odpowiedz

35

Ponieważ używasz ROR, czy słusznie jest powiedzieć, że używasz 3.1 z potokiem aktywów? Jeśli nie używasz wersji 3.1, informacje te mogą być nadal przydatne, w zależności od tego, jak robisz różne rzeczy.

Potok potokowy w wersji 3.1 powoduje, że pliki js są przenoszone w kolejności alfabetycznej, gdy pliki znajdują się w tym samym folderze.

Z tego powodu widok city_view.js zostanie wykonany przed location_view.js. Następnie, gdy CitiesView próbuje się zdefiniować, LocationsView jeszcze nie istnieje. (Ale to trochę mnie myli, bo czy nie powinieneś używać plików .coffee zamiast plików .js?)

Będziesz musiał zmuckować kolejność plików w potoku zasobów (sterowane za pomocą komentarzy) w celu aby uzyskać prawidłowy plik wykonany ... lub zmienić nazwy.

Innymi słowy, możesz powiedzieć Sprockets (rzeczy w RoR, która zarządza potokiem aktywów), aby najpierw zażądać drugiego pliku.

Na górze pliku cities_view.coffee można dodać następujący wiersz:

##= require ./locations_view 

Powodzenia

+0

Idealny. To było to. Dzięki! –

+3

Minęły lata, ale wciąż ocalacie tyłki dzięki tej odpowiedzi, okrzyki! –

3

Jak @brian Genisio mówi, jego kolejność alfabetyczna plików załadunku w aktywami rurociągu ROR jest to problem.

Znalazłem użyteczne umieszczenie wszystkich modeli dziedziczących po innych w podkatalogu. W ten sposób ROR najpierw ładuje wszystkie pliki w katalogu nadrzędnym, przed załadowaniem plików do podkatalogu. Wydaje się również bardziej logiczne dla czytelnika.

np. vehicle.js i (gdzie samochód rozciąga pojazd) w tym samym katalogu nie będzie działać, ponieważ car.js jest załadowany i uruchomiony przed vehicle.js i nie może go dziedziczyć.

Umieszczenie car.js w podkatalogu (np. vehicle_models/car.js) będzie wówczas działać.