簡體   English   中英

Coffeescript Backbone擴展/類繼承

[英]Coffeescript Backbone extends / Class Inheritance

我試圖打破我在骨干模型中使用的一些方法,我不明白為什么它不起作用。

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'

我不明白為什么這些方法沒有被繼承。

這是問題的一個方面: http//jsfiddle.net/Y9bPX/11/

你的縮進是關閉的。 你的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的整個塊結構都是基於縮進的,所以如果你沒有縮進,那么你就會有一堆廢話。

如果您的測試代碼與發布時一樣 (並且類上的命名空間差異是一個粘貼錯誤) ,則錯誤是您沒有在Page上調用構造函數,而是在引用它:

page = new MyApp.Models.Page;

應該

page = new MyApp.Models.Page();

在這里查看(打開控制台):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM