Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js路由未启动_Backbone.js_Coffeescript - Fatal编程技术网

Backbone.js路由未启动

Backbone.js路由未启动,backbone.js,coffeescript,Backbone.js,Coffeescript,我有一个基本路由器,在那里我定义了一些需要在任何地方运行的函数。每个路由器都扩展了这个路由器 现在我的问题是,在这个基本路由器中定义的所有路由实际上都没有触发。其他路由器中的每一条路由都可以正常工作。我已经创建了一个名为“a”的测试路由,它调用方法“b”,该方法应该会触发警报,但什么也没有发生 代码如下:(这是Coffeescript,不要注意缩进,在我的文件中可以) 因此,当我访问“/register”或“/a”时,它应该触发适当的方法,但它不会。我想知道这是否与其他路由器从这个路由器扩展的事

我有一个基本路由器,在那里我定义了一些需要在任何地方运行的函数。每个路由器都扩展了这个路由器

现在我的问题是,在这个基本路由器中定义的所有路由实际上都没有触发。其他路由器中的每一条路由都可以正常工作。我已经创建了一个名为“a”的测试路由,它调用方法“b”,该方法应该会触发警报,但什么也没有发生

代码如下:(这是Coffeescript,不要注意缩进,在我的文件中可以)

因此,当我访问“/register”或“/a”时,它应该触发适当的方法,但它不会。我想知道这是否与其他路由器从这个路由器扩展的事实有关?可能是有线的,但这是我能想到的唯一一件事,因为所有其他路由器工作正常

更新

我想我已经通过在我的主app.js文件中实例化基本路由器找到了解决方法。这就是我现在所做的:

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')
    技巧还是有点简洁:)