Backbone.js – Coffeescript s'étend

Je crée des chaînes en sélectionnant avec backbone.js par cet article http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/ , mais j'ai eu des erreurs lors de l'extension des classes.

Donc, j'ai la classe LocationsView:

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

PaysAfficher la classe:

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

Classe CitiesView:

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

Mais lorsque le code coffeescript compilé sur javascript, mes deux classes étendues ressemblent à:

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

Et j'ai eu une erreur:

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

Alors, où est le problème et comment le réparer?

Puisque vous utilisez ROR, est-il correct de dire que vous utilisez 3.1 avec le pipeline d'actifs? Si vous n'utilisez pas 3.1, cette information pourrait encore être utile, selon la façon dont vous faites les choses.

Le pipeline d'actifs de 3.1 amènera vos fichiers js dans un ordre alphabétique lorsque les fichiers se trouvent dans le même dossier.

Pour cette raison, cities_view.js sera exécuté avant locations_view.js. Ensuite, lorsque CitiesView tente de se définir, CitiesView n'existe pas encore. (Mais cela me confond un peu parce que ne devriez-vous pas utiliser des fichiers .coffee au lieu des fichiers .js?)

Vous devrez utiliser l'ordre des fichiers dans le pipeline d'actifs (contrôlable via les commentaires) afin d'obtenir le fichier correct exécuté … ou de modifier les noms.

En d'autres termes, vous pouvez dire à Sprockets (la chose dans RoR qui gère votre pipeline d'actifs) d'exiger l'autre fichier en premier.

En haut de votre fichier cities_view.coffee , vous pouvez ajouter la ligne suivante:

 ##= require ./locations_view 

Bonne chance

Comme le dit @brian Genisio, son ordre alphabétique de chargement des fichiers dans le pipeline d'actifs de ROR est le problème.

J'ai trouvé utile de mettre tous les modèles qui héritent des autres dans un sous-répertoire. De cette façon, ROR charge tous les fichiers du répertoire parent avant de charger les fichiers dans le sous-répertoire. Il semble également plus logique pour le lecteur.

Par exemple, car.js et car.js (où la voiture étend le véhicule) dans le même répertoire ne fonctionnera pas, car car.js est chargé et exécuté avant vehicle.js , et ne peut pas en hériter.

Mettre car.js dans un sous-répertoire (par exemple, vehicle_models/car.js ) fonctionnerait alors.