2011-11-02 16 views
18

estoy haciendo encadenamiento selecciona con Backbone.js por este artículo http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/, pero tiene errores, al extender las clases.Backbone.js - CoffeeScript extiende

lo tanto, tengo clase LocationsView:

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

clase CountriesView: Clase

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

CitiesView:

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

Pero cuando el código CoffeeScript compilado tener JavaScript mis dobles clases extendidas miradas como:

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

y me dieron error:

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

Por lo tanto, el origen del problema y cómo solucionarlo?

+0

¿Podría proporcionar el seguimiento completo de la pila? – thejh

Respuesta

35

Dado que está utilizando ROR, ¿es correcto decir que está utilizando 3.1 con la canalización de activos? Si no está utilizando 3.1, entonces esta información aún puede ser útil, dependiendo de cómo esté haciendo las cosas.

El oleoducto activo en 3.1 traerá sus archivos js en orden alfabético cuando los archivos se encuentran dentro de la misma carpeta.

Debido a eso, cities_view.js se ejecutarán antes locations_view.js. Entonces, cuando CitiesView intenta definirse a sí mismo, LocationsView no existe todavía. (Pero esto me confunde un poco porque no deberías estar usando archivos .coffee en lugar de archivos .js?)

Tendrás que ensuciar con el orden de los archivos en la canalización de activos (controlable a través de comentarios) en orden para obtener el archivo correcto ejecutado ... o cambiar los nombres.

En otras palabras, se puede decir Piñones (la cosa en RoR que gestiona su cartera de activos) para exigir que el otro archivo en primer lugar.

En la parte superior de su archivo cities_view.coffee, se puede añadir la siguiente línea:

##= require ./locations_view 

Buena suerte

+0

Perfecto. Eso fue todo. ¡Gracias! –

+3

Han pasado años, pero todavía estás ahorrando culos con esta respuesta, ¡salud! –

3

Como @ Brian Genisio dice, es el orden alfabético de la carga de archivos en la cartera de activos de ROR eso es la cuestión.

he encontrado que es útil para poner todos los modelos que heredan de otros en un subdirectorio. De esta forma, ROR carga primero todos los archivos en el directorio padre, antes de cargar los archivos en el subdirectorio. También parece más lógico para el lector.

p. Ej. vehicle.js y car.js (donde se extiende coche vehículo) en el mismo directorio que no funcionaría, ya que car.js se carga y se ejecuta antes de vehicle.js, y no es capaz de heredar de ella.

Poner car.js en un subdirectorio (por ejemplo, vehicle_models/car.js) funcionaría.