2011-11-02 8 views
18

私はこの記事でbackbone.jsでチェーン選択を行っていますhttp://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/、しかし、クラスを拡張するときにエラーが発生しました。Backbone.js - Coffeescript extends

だから、私は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の私の二重の拡張クラスのルックスにコンパイルしますlike:

(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はまだ存在しません。 (しかし、これはちょっと混乱します。なぜなら、.jsファイルの代わりに.coffeeファイルを使用してはいけないのですから)

アセットパイプラインのファイルの順番をコメントで制御する必要があります正しいファイルが実行されるようにするか、名前を変更します。

つまり、スプロケット(アセットパイプラインを管理するRoRのもの)に最初に他のファイルを要求することができます。あなたは次の行を追加することができますcities_view.coffeeファイルの先頭に

、:@brian Genisioが言うように

##= require ./locations_view 

幸運

+0

パーフェクト。それはそれだった。ありがとう! –

+3

年が過ぎましたが、このレスポンスでお尻を保存しています。 –

3

を、そのですRORのアセットパイプラインでのファイルの読み込みのアルファベット順問題。

サブディレクトリに他のモデルを継承するすべてのモデルを置くと便利です。このようにして、RORは、サブディレクトリにファイルをロードする前に、親ディレクトリ内のすべてのファイルを最初にロードします。それは読者にとってより論理的です。

同じディレクトリ内のvehicle.jscar.js(車が乗っている場所)はcar.jsがロードされてからvehicle.jsの前に実行され、それを継承することはできません。

サブディレクトリ(vehicle_models/car.js)にcar.jsを配置すると機能します。

関連する問題