2011-11-02 127 views
18

我正在通过这篇文章http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/与backbone.js进行链接选择,但在扩展类时遇到了错误。Backbone.js - Coffeescript延伸

所以,我有LocationsView类:

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

CountriesView类:

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 

所以,这里的问题是,如何解决?

+0

你能提供完整的堆栈跟踪吗? – thejh

回答

35

既然您使用的是ROR,那么说您正在3.1使用资产管道是否正确?如果你不使用3.1,那么这个信息可能仍然有用,这取决于你如何做事。

3.1中的资产管道将在文件位于同一文件夹中时按字母顺序显示js文件。

因此,cities_view.js将在locations_view.js之前执行。然后,当CitiesView试图自己定义,LocationsView尚不存在。 (但这有点让我困惑,因为你不应该使用.coffee文件而不是.js文件吗?)

您必须按照顺序依次处理资产管道中的文件顺序(可通过注释控制)获取正确的文件执行...或更改名称。

换句话说,您可以告诉Sprockets(管理资产管道的RoR中的事情)先要求另一个文件。

在你cities_view.coffee文件的顶部,您可以添加以下行:

##= require ./locations_view 

好运

+0

完美。就是这样。谢谢! –

+3

多年过去了,但你仍然在为这个回应保存屁股,欢呼! –

3

由于@布赖恩Genisio说,它的文件加载的ROR的资产管道的字母顺序这问题。

我发现将其他人继承的所有模型放在子目录中很有用。这样,在将子文件加载到子目录之前,ROR首先加载父目录中的所有文件。对读者来说,它也显得更合乎逻辑。

例如因为car.jsvehicle.js之前已加载并运行,并且无法从中继承,因此vehicle.jscar.js(车辆延伸车辆)将无法运行。

然后将car.js放在子目录(例如vehicle_models/car.js)中。