Backbone.js路由未启动
我有一个基本路由器,在那里我定义了一些需要在任何地方运行的函数。每个路由器都扩展了这个路由器 现在我的问题是,在这个基本路由器中定义的所有路由实际上都没有触发。其他路由器中的每一条路由都可以正常工作。我已经创建了一个名为“a”的测试路由,它调用方法“b”,该方法应该会触发警报,但什么也没有发生 代码如下:(这是Coffeescript,不要注意缩进,在我的文件中可以) 因此,当我访问“/register”或“/a”时,它应该触发适当的方法,但它不会。我想知道这是否与其他路由器从这个路由器扩展的事实有关?可能是有线的,但这是我能想到的唯一一件事,因为所有其他路由器工作正常 更新 我想我已经通过在我的主app.js文件中实例化基本路由器找到了解决方法。这就是我现在所做的:Backbone.js路由未启动,backbone.js,coffeescript,Backbone.js,Coffeescript,我有一个基本路由器,在那里我定义了一些需要在任何地方运行的函数。每个路由器都扩展了这个路由器 现在我的问题是,在这个基本路由器中定义的所有路由实际上都没有触发。其他路由器中的每一条路由都可以正常工作。我已经创建了一个名为“a”的测试路由,它调用方法“b”,该方法应该会触发警报,但什么也没有发生 代码如下:(这是Coffeescript,不要注意缩进,在我的文件中可以) 因此,当我访问“/register”或“/a”时,它应该触发适当的方法,但它不会。我想知道这是否与其他路由器从这个路由器扩展的事
new Etaxi.Routers.Base() (this is the new one)
new Etaxi.Routers.Videos()
你觉得这有什么问题吗?我的咖啡脚本已经生锈了,但是。。。在我看来:
class Etaxi.Routers.Base extends Backbone.Router
通常在JS中,您会:
Etaxi.Routers.Base = Backbone.Router.extend({
... // properties and methods of Etaxi.Routers.Base go here
});
你的咖啡脚本相当吗?如果没有,那可能是您的问题。问题是
扩展将不会合并类中的属性,子类的属性将完全替换超类的属性。例如,鉴于:
class Etaxi.Routers.Base extends Backbone.Router
routes:
'register' : 'registerDevice'
'a' : 'b'
class R extends Etaxi.Routers.Base
routes:
'c': 'd'
然后,R
实例的路由将仅为'c':'d'
。下面是一个普通(非主干)CoffeeScript类的演示:
如果您需要合并属性,您必须自己使用以下方法:
class M
m: { a: 'b' }
class Pancakes extends M
constructor: ->
@m = _({}).extend(@m, a: 'B', c: 'd')
class R extends Backbone.Router
routes:
'a': 'b'
class RR extends R
@::routes = _({}).extend(R::routes, 'c': 'd')
演示:
但是这种诡计在主干网路由器上是行不通的,因为主干网有点不同:
var Router = Backbone.Router = function(options) {
options || (options = {});
if (options.routes) this.routes = options.routes;
this._bindRoutes();
this.initialize.apply(this, arguments);
};
因此,在调用初始化
之前,需要正确设置@路由
;这意味着您不能将新路由合并到您的initialize
中的@routes
,并期望它们连接起来。此外,在使用骨干网时,您可能不希望提供< <代码>构造器< /代码>,因为您必须完全实现标准骨干网。路由器构造函数并在中间滑动多余的东西。
两个选项立即出现:
通过调用子类initialize
,手动添加子类的路由
将路由排除在基类之外,向基类添加一个方法,该方法使用route
调用添加基类的路由,然后在子类initialize
方法中调用该方法
另一个可能的选择是这样做:
class M
m: { a: 'b' }
class Pancakes extends M
constructor: ->
@m = _({}).extend(@m, a: 'B', c: 'd')
class R extends Backbone.Router
routes:
'a': 'b'
class RR extends R
@::routes = _({}).extend(R::routes, 'c': 'd')
这应该让您在正确的时间在子类的路由中{'a':'b','c':'d'}
;我还没有完全测试过这个,但它可以在一个简单的演示中运行:
不过,所有的胡闹都可能毫无意义。您可以拥有任意数量的路由器,因此子类化可能完全没有必要。例如,这很好:
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()
演示:CoffeeScript的类。。。extends
与主干网的extends
子类化完全兼容。啊。在这种情况下,作为调试检查(您正在使用的routes属性应该可以工作,但只是为了让我们能够获得更多信息…),您可以尝试通过以下方式在initialize中连接您的路由:this.route('register','registerDevice',this.registerDevice)?非常感谢您对问题的详细解释。我已经用一个可能的解决方案更新了我上面的帖子,但我不确定这是否是一个好方法,也许你可以看看。@drale2k:我想我可能在你评论时添加了一个类似的更新。有多条路线没有错,检查我更新答案的底部。即便如此,@::routes=(R::routes).extend('c':'d')
技巧还是有点简洁:)