为什么使用CoffeeScript类继承时主干模型不能正常工作

Why dont Backbone models work correctly when using CoffeeScript class inheritance

本文关键字:常工作 不能 工作 模型 CoffeeScript 继承 为什么      更新时间:2023-09-26

我看过几篇关于如何在Backbone中使用CoffeeScript的扩展功能的文章,但我无法让它发挥作用。以下代码:

Backbone = require 'Backbone'
# The backbone way
Base = Backbone.Model.extend (
    initialize: ->
)
Model  = Base.extend (
    initialize: ->
        console.log 'initialize called'
        @on 'change:foo', ->
            console.log 'foo changed (Base)'
    defaults: (
        foo: 'bar'
    )
)
model = new Model()
model.set 'foo', 'baz'
console.log model.get 'foo'

# The coffeescript way with double ineritance
class Base2 extends Backbone.Model
    constructor: ->
class Model2 extends Base2
    constructor: ->
        console.log 'constructor called (Base2)'
        @on 'change:foo', ->
            console.log 'foo changed (Base2)'
    defaults: (
        foo: 'bar'
    )
model2 = new Model2 (foo: 'bar')
model2.set 'foo', 'baz2'
console.log model2.get 'foo'

投掷:

  % coffee index.coffee                                                                                                                                                                            
initialize called
foo changed (Base)
baz
constructor called (Base2)
TypeError: Cannot read property 'foo' of undefined
  at Model2._.extend.set 

你也可以在这里玩http://codepen.io/guyht/pen/LEOdZr?editors=001

您的问题是通过指定自己的constructor来替换Backbone的构造函数。Backbone需要使用自己的构造函数来设置所有的Backbone内部,类似构造函数的代码应该在initialize中,就像使用Backbone的extend函数而不是CoffeeScript的extends关键字时一样:

class Base2 extends Backbone.Model
    initialize: ->
class Model2 extends Base2
    initialize: ->
        console.log 'initialize called (Base2)'
        @on 'change:foo', ->
            console.log 'foo changed (Base2)'
    defaults: (
        foo: 'bar'
    )

更新的演示:http://codepen.io/anon/pen/myqxWY