【问题标题】:Backbone Marionette controller method not called from appRouter未从 appRouter 调用 Backbone Marionette 控制器方法
【发布时间】:2014-04-20 09:47:42
【问题描述】:

我正在尝试从 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;
    }
  });
},

【问题讨论】:

    标签: javascript backbone.js coffeescript marionette


    【解决方案1】:

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

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

    【讨论】:

    • Coffeescript 上不需要括号来将对象传递给方法。在js2coffee.org 尝试该行以查看 JS 代码。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢@Dmytro。这种改变做到了。我现在已经将代码更改为使用 initialize:after 而不必担心初始化程序的顺序。再次感谢!
    猜你喜欢
    • 2016-04-02
    • 2016-02-22
    • 2016-06-10
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多