无法从appRouter调用Backbone Marionette控制器方法

时间:2014-03-14 21:41:47

标签: javascript backbone.js coffeescript marionette

我试图从Marionette appRouter触发Marionette控制器方法,但这些方法在它们应该被触发时不会被触发。

您可以在http://jsfiddle.net/gabceb/bW69k/

查看我的代码

总之,代码初始化了一个控制器,一个appRouter和一个Marionette应用程序。我希望代码在调用适当的路由时触发控制器(它执行)的初始化和索引方法。代码被移植并简化为从真正的应用程序到Fiddler,所以这不是Fiddler的错。

我还通过将appRouter的方法更改为index1并让appRouter抱怨该方法不存在来验证appRouter正在使用正确的控制器(请注意,这只是我做的一个测试,并没有实际实现在我在Fiddler上发布的代码中

# app.coffee.js

class PagesController extends Marionette.Controller
    initialize: (options) =>
        alert "Controller initialized"

        return

    index: () =>
        alert "Index method called"

        return

class AppRouter extends Marionette.AppRouter
    appRoutes: {
       "" : "index"
    }

window.app = new Backbone.Marionette.Application()

window.app.addInitializer( (options) =>
    Backbone.history.start(pushState: true)
)

window.app.addInitializer( (options) =>
    window.app.appRouter = new AppRouter(controller : new PagesController())
)

window.app.start()

我已经对此进行了一些调试,看起来每当加载页面时,Backbone.History处理程序数组都是空的。这就是代码在Backbone代码上的样子。

// Attempt to load the current URL fragment. If a route succeeds with a
// match, returns `true`. If no defined routes matches the fragment,
// returns `false`.
loadUrl: function(fragment) {
  fragment = this.fragment = this.getFragment(fragment);
  return _.any(this.handlers, function(handler) {
    if (handler.route.test(fragment)) {
      handler.callback(fragment);
      return true;
    }
  });
},

2 个答案:

答案 0 :(得分:2)

启动AppRouter后创建Backbone.history的问题。

您可以在此处了解更多信息:Right place to start Backbone.history?

答案 1 :(得分:-1)

我的CoffeeScript很模糊,但看起来你正在初步化appRouter错误:你需要传递一个对象:

window.app.appRouter = new AppRouter({ controller : new PagesController() })