[英]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.