【问题标题】:Coffeescript Backbone extends / Class InheritanceCoffeescript Backbone 扩展/类继承
【发布时间】:2012-03-15 18:29:13
【问题描述】:

我正在尝试分解我在主干模型中使用的一些方法,但我不明白为什么它不起作用。

base_class.js.coffee

class MyApp.Models.BaseClass extends Backbone.Model

Linked: () =>
  @._linked

Link: (form) =>
  if @._linked == false
    $(form).backboneLink(@, {'prefixed':true})
    @._linked = true
  else
    $(form).backbonePopulate(@, {'prefixed':true})

Dirty: () ->
  @collection.Dirty()
  @._dirty = true

Clean: () ->
  @._dirty = false

isDirty: () =>
  @._dirty

page.js.coffee

#= require ./base_class

class MyApp.Models.Page extends MyApp.Models.BaseClass

  initialize: () ->
    console.log('Page Object initialized')
    @._dirty = false
    @changes = []
    @.name = 'Page'
    @._linked = false

 url: () ->
    '/pages/' + @id

但是当我进入控制台时

page = new MyApp.Models.Page();    #=> Page Object initialized
page.Link($('#myform'));   #=>  Uncaught TypeError: Object #<Page> has no method 'Link'

我不明白为什么这些方法没有被继承。

这是一个问题的 jsfiddle:http://jsfiddle.net/Y9bPX/11/

【问题讨论】:

    标签: inheritance backbone.js coffeescript


    【解决方案1】:

    您的缩进已关闭。您的 CoffeeScript 如下所示:

    class MyApp.Models.BaseClass extends Backbone.Model
    
    Linked: () =>
      @._linked
    #...
    

    但它应该是这样的:

    class MyApp.Models.BaseClass extends Backbone.Model
    
      Linked: () =>
        @._linked
      #...
    

    您没有缩进会给您一个空的MyApp.Models.BaseClass,然后是 JavaScript 中匿名对象内的一堆无法访问的函数:

    // CoffeeScript boilerplate...
    MyApp.Models.BaseClass = (function(_super) {
      // Standard CoffeeScript class boilerplate...
    })(Backbone.Model);
    
    ({
      Linked: function() {
        return _this._linked;
      },
      // etc...
    });
    

    所以在MyApp.Models.BaseClass 中修复你的缩进,你应该没问题。请记住,CoffeeScript 的整个块结构都是基于缩进的,所以如果你没有正确的缩进,那么你就会有一堆废话。

    【讨论】:

      【解决方案2】:

      如果您的测试代码与您发布的一样(并且类上的命名空间差异是粘贴错误),则错误是您没有调用 Page 上的构造函数,而是您重新引用它:

      page = new MyApp.Models.Page;
      

      应该是

      page = new MyApp.Models.Page();
      

      在这里查看(打开控制台):

      http://jsfiddle.net/Y9bPX/3/

      【讨论】:

      • 有什么想法吗?我想我要打开一个主干问题
      • 调用new时的括号在JavaScript和CoffeeScript中都是可选的。
      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多