2012-03-15 2 views
1

Я пытаюсь вырвать некоторые методы, которые я использую по моим базовым моделям, и я не понимаю, почему он не работает.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' 

Я не понимаю, почему методы Арен» t наследуется.

Вот jsfiddle вопроса: http://jsfiddle.net/Y9bPX/11/

ответ

4

Ваших отступов выключены. Ваш 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 основана на отступе, поэтому, если у вас нет своего отступов, тогда у вас есть куча бессмыслицы.

+0

+1 для значительного пробела. – Soviut

0

Если ваш тестовый код, как вы вывесили его (и пространство имен различия по классам является склеивание ошибка) , ошибка в том, что вы не вызов конструктора на странице, а вы делаете ссылку на него:

page = new MyApp.Models.Page; 

должен быть

page = new MyApp.Models.Page(); 

Проверьте это здесь (открыть консоль):

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

+0

любые идеи? Я думаю, что я собираюсь открыть проблему с магистралью – theSociableme

+1

Скобки при вызове 'new' являются необязательными и в JavaScript, и в CoffeeScript. –

Смежные вопросы