Проблема в том, что extends
не объединит свойства в ваших классах, свойства подкласса полностью заменят свойства суперкласса.Например, учитывая это:
class Etaxi.Routers.Base extends Backbone.Router
routes:
'register' : 'registerDevice'
'a' : 'b'
class R extends Etaxi.Routers.Base
routes:
'c': 'd'
Тогда routes
для экземпляра R
будет просто 'c': 'd'
.Вот демонстрация с простыми (не Backbone) классами CoffeeScript: http://jsfiddle.net/ambiguous/ScUs2/
Если вам нужно объединить свойства, вам придется сделать это самостоятельно с чем-то вроде этого:
class M
m: { a: 'b' }
class Pancakes extends M
constructor: ->
@m = _({}).extend(@m, a: 'B', c: 'd')
Демо: http://jsfiddle.net/ambiguous/SR6ej/
Но этот вид хитрости не будет работать с Backbone.Router
, поскольку последовательность построения немного отличается:
var Router = Backbone.Router = function(options) {
options || (options = {});
if (options.routes) this.routes = options.routes;
this._bindRoutes();
this.initialize.apply(this, arguments);
};
Так@routes
необходимо правильно настроить до вызова initialize
;это означает, что вы не можете объединить новые маршруты в @routes
в вашем initialize
и ожидать, что они будут подключены.Кроме того, вы, вероятно, не хотите указывать constructor
при использовании Backbone, поскольку вам необходимо полностью реализовать стандартный конструктор Backbone.Router и добавить в него дополнительные элементы.
Парапараметры сразу появляются:
- Вручную добавить маршруты подкласса, вызвав
route
в подклассах initialize
. - Оставить маршруты вне базыдобавьте в базовый класс метод, который добавляет маршруты базового класса с помощью вызовов
route
, а затем вызовите этот метод в методе подкласса initialize
.
Другой возможный вариант - сделатьчто-то вроде этого:
class R extends Backbone.Router
routes:
'a': 'b'
class RR extends R
@::routes = _({}).extend(R::routes, 'c': 'd')
Это даст вам { 'a': 'b', 'c': 'd' }
в подклассе routes
в нужное время;Я не полностью протестировал этот, но он работает в простом демо: http://jsfiddle.net/ambiguous/QQbrx/
Хотя все это может быть бессмысленным.Вы можете иметь столько маршрутизаторов, сколько захотите, поэтому подклассы могут быть совершенно ненужными.Например, это работает просто отлично:
class R extends Backbone.Router
routes:
'a': 'b'
b: -> console.log('b')
class RR extends Backbone.Router
routes:
'c': 'd'
d: -> console.log('d')
new R
new RR
Backbone.history.start()
Демо: http://jsfiddle.net/ambiguous/mr83v/