【问题标题】:Module.start() fired twice?Module.start() 触发了两次?
【发布时间】:2012-09-12 13:49:58
【问题描述】:

我目前正在用 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 */ });

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

再次感谢!

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

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

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

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


    更新您的其他问题:

    如果您还在模块上调用了stop,则多次调用start 只会重新运行初始化程序。

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

    希望对您有所帮助。

    【讨论】:

    • 嘿 Derick,感谢您的回复(也感谢木偶;)。我用更多信息编辑了这个问题。
    • 接受了让我提前了解最重要的问题,如果您有任何问题,您能否给我有关模块工作流程的提示(如问题中更新的那样)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2013-02-16
    • 2018-10-28
    • 2018-10-16
    • 2011-10-01
    • 2014-08-02
    相关资源
    最近更新 更多