我目前正在使用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 */ });
我基本上需要有关如何使用模块的更多信息,我找不到有关此方面的适当工作流程的任何好信息。
再次感谢!
答案 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,可以很容易地将其提取到路由器中的方法或路由器调用的对象中。
希望有所帮助。