[英]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();
在這里查看(打開控制台):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.