2011-11-02 132 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)中。