Module.start()被解雇了两次?

时间:2012-09-12 13:49:58

标签: javascript backbone.js marionette

我目前正在使用Backbone和Marionette重写一个旧的应用程序。 在我的模块文件spls.module.insight.js中:

spls.module('Insight', {
    startWithApp: false,
    define: function(self, spls, Backbone, Marionette, $, _) {

        self.start = function () {
            console.log('Insight started!');
        }

        self.addInitializer(function() {
           console.log('Insight instantiated!');
        });
    }
});

我试图挂钩到start()方法,因为我认为这是在等待模块的start()时使用的常规方法。 (它确实只被初始化一次,所以我不能使用初始化器。但还有什么?) 第二次调用spls.module('Insight')。start();我收到两个“洞察力开始!”消息。 这是为什么?

有没有更好的方法来解决这个问题?


有关我想要实现的目标的更多信息: 我刚刚开始使用Marionette,因此对模块的功能以及它们之间的交互方式没有深刻的理解。 我想要实现的基本上是一个主要的App(工作),通过路由器打开页面(模块)。 目前我正在打电话

Spls.module('Insight').start();

从路由器,但我不知道如何设计模块本身。 初始化程序似乎只在第一个.start()上调用,因此模块不知道何时显示它的内容。 我应该像这样使用事件聚合器吗?

// router
Spls.module('Insight').start();
Spls.vent.trigger('insight:show');

// module
Spls.vent.on('insight:show', function () {  /* show index */ });

我基本上需要有关如何使用模块的更多信息,我找不到有关此方面的适当工作流程的任何好信息。

再次感谢!

1 个答案:

答案 0 :(得分:2)

不要覆盖start方法。糟糕的事情会发生,正如您已经看到的那样,包括您的初始化程序将无法运行,其他幕后代码将无法执行。

如果在启动模块时需要运行代码,请使用初始化程序。如果您需要在模块停止时运行代码,请使用终结器。 start方法和stop方法负责在幕后运行初始化器,终结器和一些其他必要的东西。

至于显示两次的消息 - 在我的快速测试中,我没有看到此消息两次。我只看过一次。是否有另一部分代码定义了同名的第二个模块(拆分模块定义)或其他类似的东西?


更新您的其他问题:

多次调用start只会在模块上调用stop时重新运行初始值设定项。


Spls.module("Insight").start();

// some time later...
Spls.module("Insight").stop();

// now it can be re-started and the initializers will run again
Spls.module("Insight").start();

您可以跟踪当前正在运行的模块。然后,当新路线触发时,您可以在开始下一个路线之前停止当前路线。这应该足以使事情正常工作:


insightRoute: function(){
  if (this.module){
    this.module.stop();
  }
  this.module = Spls.module("Insight");
  this.module.start();
}

如果您使用的是Marionette的AppRouter,可以很容易地将其提取到路由器中的方法或路由器调用的对象中。

希望有所帮助。