首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Backbone.js - Coffeescript扩展

Backbone.js - Coffeescript扩展
EN

Stack Overflow用户
提问于 2011-11-02 15:34:08
回答 2查看 5.6K关注 0票数 18

我在本文http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/中使用backbone.js进行链接选择,但在扩展类时遇到错误。

所以,我有一个LocationsView类:

代码语言:javascript
复制
class Blog.Views.LocationsView extends Backbone.View
  events:
    "change": "changeSelected"

CountriesView类:

代码语言:javascript
复制
class Blog.Views.CountriesView extends Blog.Views.LocationsView
  setSelectedId: (countryId) ->

CitiesView类:

代码语言:javascript
复制
class Blog.Views.CitiesView extends Blog.Views.LocationsView
  setSelectedId: (cityId) ->

但是当coffeescript代码编译成javascript时,我的双扩展类如下所示:

代码语言: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);

我得到了一个错误:

代码语言:javascript
复制
Uncaught TypeError: Cannot read property 'prototype' of undefined    cities_view.js:5

那么,问题出在哪里,如何解决呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-02 17:42:27

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

当js文件位于同一文件夹中时,3.1中的资源管道将按字母顺序显示这些文件。

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

你必须弄乱资产管道中文件的顺序(可通过注释控制),以便执行正确的文件……或者更改名称。

换句话说,您可以告诉链轮( RoR中管理资源管道的东西)首先需要另一个文件。

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

代码语言:javascript
复制
##= require ./locations_view

祝好运

票数 35
EN

Stack Overflow用户

发布于 2013-01-05 22:05:19

正如@brian Genisio所说,ROR资产管道中文件加载的字母顺序是问题所在。

我发现将继承自其他模型的所有模型放在一个子目录中是很有用的。这样,ROR先加载父目录中的所有文件,然后再加载子目录中的文件。对于读者来说,它似乎也更符合逻辑。

例如,同一目录中的vehicle.jscar.js (其中car扩展vehicle)不起作用,因为car.js是在vehicle.js之前加载和运行的,并且不能从它继承。

然后将car.js放在一个子目录(例如vehicle_models/car.js)中就可以了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7977032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档