2011-11-02 32 views
18

Tôi đang tạo chuỗi lựa chọn với backbone.js theo bài viết này http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/, nhưng có lỗi, khi mở rộng lớp học.Backbone.js - Coffeescript mở rộng

Vì vậy, tôi có lớp LocationsView:

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

lớp CountriesView:

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

CitiesView lớp:

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

Nhưng khi coffeescript mã biên dịch để javascript lớp kéo dài đôi ngoại hình của tôi như:

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

Và tôi đã nhận lỗi:

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

Vì vậy, nơi mà vấn đề được và làm thế nào để sửa chữa nó?

+0

Bạn có thể cung cấp dấu vết ngăn xếp đầy đủ không? – thejh

Trả lời

35

Vì bạn đang sử dụng ROR, có đúng khi nói rằng bạn đang sử dụng 3.1 với đường dẫn nội dung không? Nếu bạn không sử dụng 3.1, thì thông tin này có thể vẫn hữu ích, tùy thuộc vào cách bạn đang làm việc.

Đường ống nội dung trong 3.1 sẽ đưa tệp js của bạn theo thứ tự bảng chữ cái khi các tệp nằm trong cùng một thư mục.

Do đó, cities_view.js sẽ được thực thi trước locations_view.js. Sau đó, khi CitiesView cố gắng tự xác định, LocationsView chưa tồn tại. (Nhưng điều này gây nhầm lẫn cho tôi một chút vì bạn không nên sử dụng tệp .coffee thay vì tệp .js?)

Bạn sẽ phải xếp thứ tự các tệp trong đường dẫn nội dung (có thể điều khiển qua nhận xét) theo thứ tự để lấy đúng tệp đã thực thi ... hoặc thay đổi tên.

Nói cách khác, bạn có thể nói Sprockets (điều trong RoR quản lý đường dẫn nội dung của bạn) để yêu cầu tệp khác trước.

Ở phía trên cùng của tập tin cities_view.coffee của bạn, bạn có thể thêm các dòng sau:

##= require ./locations_view 

Chúc may mắn

+0

Hoàn hảo. Điều đó là vậy đó. Cảm ơn! –

+3

Năm đã qua nhưng bạn vẫn đang cứu lừa với phản ứng này, chúc mừng! –

3

Như @ Brian Genisio nói, nó thứ tự chữ cái của tập tin tải trong đường ống dẫn tài sản ROR của đó là vấn đề.

Tôi thấy hữu ích khi đặt tất cả các mô hình kế thừa từ những người khác trong thư mục con. Bằng cách này, ROR tải tất cả các tệp trong thư mục mẹ trước, trước khi tải các tệp trong thư mục con. Nó cũng xuất hiện hợp lý hơn với người đọc.

ví dụ: vehicle.jscar.js (trong đó xe mở rộng xe) trong cùng một thư mục sẽ không hoạt động, vì car.js được tải và chạy trước vehicle.js và không thể kế thừa từ nó.

Đặt car.js vào thư mục con (ví dụ: vehicle_models/car.js) sau đó sẽ hoạt động.