2012-03-15 8 views
1

私はバックボーンモデル全体で使用しているいくつかの方法を打破しようとしていますが、なぜ動作しないのか分かりません。私は、コンソールCoffeescript Backbone extends/Class継承

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

に行くとき

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 

は、しかし、私は「メソッドが上がらない理由を理解しませんtは継承されます。ここで

問題のjsfiddleです:http://jsfiddle.net/Y9bPX/11/

答えて

4

あなたのインデントがオフになっています。

class MyApp.Models.BaseClass extends Backbone.Model 

Linked:() => 
    @._linked 
#... 

が、それは次のようになります:あなたのCoffeeScriptはこのようになります

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のブロック構造全体がインデントに基づいていることを覚えておいてください。インデントがなければ、ナンセンスがたくさんあります。

+0

+1重要な空白スペース。 – Soviut

0

あなたは それを掲示して、あなたのテストコードがある(とクラスの名前空間の違いが貼り付け間違いである)場合 、エラーはないだということです代わりに、あなたはそれを参照している、ページ上のコンストラクタを呼び出す:

page = new MyApp.Models.Page; 

があるべき

page = new MyApp.Models.Page(); 

は(コンソールを開く)ここでそれをチェックアウト:

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

+0

どのようなアイデアですか?私はバックボーンで問題を開くつもりだと思う。 – theSociableme

+1

JavaScriptとCoffeeScriptの両方で、 'new'を呼び出すときにかっこは省略可能です。 –