Backbone.js - Coffeescript 扩展

Posted

技术标签:

【中文标题】Backbone.js - Coffeescript 扩展【英文标题】:Backbone.js - Coffeescript extends 【发布时间】:2011-12-20 02:14:31 【问题描述】:

我在这篇文章http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/ 中使用backbone.js 进行链接选择,但是在扩展类时出错了。

所以,我有 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

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

【问题讨论】:

您能提供完整的堆栈跟踪吗? 【参考方案1】:

既然您使用的是 ROR,那么说您将 3.1 与资产管道一起使用是否正确?如果您使用的不是 3.1,那么此信息可能仍然有用,具体取决于您的操作方式。

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

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

您必须弄乱资产管道中文件的顺序(可通过 cmets 控制)才能执行正确的文件...或更改名称。

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

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

##= require ./locations_view

祝你好运

【讨论】:

完美。就是这样。谢谢! 多年过去了,但你仍然用这个回复来拯救驴子,干杯!【参考方案2】:

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

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

例如vehicle.jscar.js(汽车扩展车辆)在同一目录中不起作用,因为 car.jsvehicle.js 之前加载和运行,并且无法从它继承。

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

【讨论】:

以上是关于Backbone.js - Coffeescript 扩展的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js 和 Backbone 实现的最佳 URL 结构

Backbone.js入门学习笔记目录

Backbone.js:为 Backbone.sync 实现定义超时

Backbone.js - 正确的模型初始化

Backbone.js - 集合未定义

Backbone.js快速入门