2012-09-12 77 views
0

我目前正在用Backbone和Marionette重写一个旧应用程序。 在我的模块文件spls.module.insight.js:Module.start()发射两次?

​​

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

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


更多信息什么我想要实现: 我刚开始使用的木偶,因此不具备什么样的模块做的,在深刻理解他们互动哪种方式呢。 我想要实现的基本上是一个主要的应用程序(工程),它通过路由器打开页面(模块)。 目前我打电话

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

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

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

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

我基本上需要更多关于如何使用模块的信息,我无法找到任何关于此相关工作流的好信息。再次

谢谢!

回答

2

请勿重写启动方法。正如你已经看到的那样,不好的事情会发生,包括你的初始化程序不会运行,其他的幕后代码不会被执行。

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

至于该消息显示两次 - 在我的快速测试中,我没有看到这个消息两次。我只看到它一次。是否还有一些代码定义了第二个同名的模块(一个拆分模块定义)或这些代码的其他内容?

您还有其他问题

更新:

调用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(); 
} 

这可以很容易地在你的路由器的方法或您的路由器,如果你使用的木偶的AppRouter调用该对象被提取。

希望有所帮助。

+0

嘿德里克,谢谢你的回复(还有木偶;)。 我用更多的信息编辑了这个问题。 –

+0

接受让我领先一步,如果你有任何问题,你能否给我一些关于模块工作流程的提示(在问题中已更新)? –

+0

太棒了,谢谢! –