【问题标题】:Declaring Backbone Collection in CoffeeScript在 CoffeeScript 中声明主干集合
【发布时间】:2011-08-27 20:02:30
【问题描述】:

我正在尝试找出在 CoffeeScript 中为 Backbone 集合声明模型的正确方法。让我用一个例子来演示:

class MyApp.Collections.Likes extends Backbone.Collection
  constructor: (@models, @options) ->
  model: MyApp.Models.Like

当我初始化这个集合并创建一个新模型时,它失败了。

likes = new MyApp.Collections.Likes
like = new likes.model // same result for likes.model.new

TypeError: Result of expression 'likes.model' [undefined] is not an object.

查看编译后的JavaScript,模型定义如下:

MyApp.Collections.Likes = (function() {
  __extends(Likes, Backbone.Collection);
  function Likes(models, options) {
    this.models = models;
    this.options = options;
  }
  Likes.prototype.model = MyApp.Models.Like; // <--
  return Likes;
})();

我可以通过两种可行的方式定义模型:


解决方案 1

class MyApp.Collections.Likes extends Backbone.Collection
  constructor: (@models, @options) ->
  model: -> MyApp.Models.Like // Notice the ->

编译成:

MyApp.Collections.Likes = (function() {
  __extends(Likes, Backbone.Collection);
  function Likes(models, options) {
    this.models = models;
    this.options = options;
  }
  Likes.prototype.model = function() { // <-- added to the prototype as a function
    return MyApp.Models.Like;
  }
  return Likes;
})();

解决方案 2

class MyApp.Collections.Likes extends Backbone.Collection
  constructor: (@models, @options) ->
  @model: MyApp.Models.Like // Notice the @

编译成:

MyApp.Collections.Likes = (function() {
  __extends(Likes, Backbone.Collection);
  function Likes(models, options) {
    this.models = models;
    this.options = options;
  }
  Likes.model = function() { // <-- not added to prototype
    return MyApp.Models.Like;
  }
  return Likes;
})();

我很确定 解决方案 1 是更好的解决方案。然而,我看过的很多网站的教程都没有使用-&gt;@ 来定义它。

我是不是做错了什么?

Like 模型没有任何问题,它非常普通:

class MyApp.Models.Like extends Backbone.Model

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

    我无法复制您的错误。这是我的代码:

    class Like extends Backbone.Model
    
    class Likes extends Backbone.Collection
        model: Like
    
    likes = new Likes
    like = new likes.model
    console.log like instanceof Like  # true
    

    你有可能在某个地方打错了吗?特别是,MyApp.Models.Like 是否定义在您编写 model: MyApp.Models.Like 的位置?测试

    console.log MyApp.Collections.Likes::model?
    

    console.log MyApp.Collections.Likes::model is MyApp.Models.Like
    

    都应该给你true。如果他们这样做了,那么new likes.model 应该等同于new MyApp.Models.Like

    【讨论】:

    • 你能告诉我你为模型和集合编译的 JavaScript 吗?
    • @Jey 为什么不直接将代码复制并粘贴到 coffeescript.org 的 Try CoffeeScript 框中?
    • Arg,我一直在编写这个应用程序 TDD,并没有费心在浏览器中检查它。问题实际上出在我的 Jasmine 配置中,它正在加载所有已编译的 JavaScript 文件public/javascript/compiled/**/*.js。这不考虑导致此错误的依赖关系排序。感谢您证明我最初在浏览器中所做的工作。
    • 如果您要全面使用 TDD,您可能需要使用 stitch。然后您可以在 Node 下进行测试并连接浏览器的所有内容。我在 Node 下运行我的测试代码,因为它的设置速度很快(你只需 npm install backbone 然后将 Backbone = require 'backbone' 放在文件顶部)。
    【解决方案2】:

    当你写作时你期望发生什么

    like = likes.model.new
    

    ?该语法在 Ruby 中有效,但在 CoffeeScript 中,它只是将 likes.modelnew 属性分配给 like。在这种情况下,这只是undefined。试试

    like = new likes.model
    

    改为。

    【讨论】:

    • 这实际上是我的一个错字,我只是在测试一些东西,忘了把它切换回来。我试过new likes.modellikes.model.new。同样的错误。 [纠正我的问题]
    【解决方案3】:

    嘿,我知道我参加这个聚会迟到了,但我想补充一点,每次我看到这个问题都是因为程序员忘记了 coffeescript 中的类是一个泄漏的抽象,并且他们的声明以前没有被阅读过执行——在这种情况下,模型需要在被编译的 js 尝试将其添加到集合的原型之前定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2015-05-30
      相关资源
      最近更新 更多