0

我目前正在用 Backbone 和 Marionette 重写一个旧应用程序。在我的模块文件 sls.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,因此对模块的作用以及它们交互的方式还没有深入了解。我想要实现的基本上是一个主要的应用程序(作品),它通过路由器打开页面(模块)。目前我正在打电话

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

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

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

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

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

再次感谢!

4

1 回答 1

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,这可以很容易地提取到路由器中的方法或路由器调用的对象中。

希望有帮助。

于 2012-09-12T23:36:29.220 回答