如何扩展MarionetteJS模块以减少代码重复

1 javascript module extend backbone.js marionette

我有一个通知工具栏,它是一个模块.非常类似于facebook本机应用程序中的通知工具栏.在此工具栏中有3个区域:

  • InvitesRegion
  • RequestsRegion
  • NotificationsRegion

每个区域都包含自己的模块(InvitesModule,RequestsModule,NotificationsModule).但是,每个都具有完全相同的功能:

  • 检查服务器是否有新的(邀请|请求|通知)
  • 如果找到,请更新关联的区域
  • 然后是一大堆其他函数(点击弹出collectionView等..)

我可以编写一个模块,比如InvitesModule并让我的另外两个模块扩展该模块,这样我就可以覆盖我需要的变量吗?

谢谢,如果我能更清楚,请告诉我

Chr*_*tta 5

为什么是的,是的,你可以!虽然Marionette本身并不完全允许您创建"基本模块",但它允许您修改现有模块.我们在应用程序中利用了这一点来创建ModuleDefaults我们用于所有模板的定义.以下是它的工作原理:

var ModuleDefaults = {
  // Define baseline behavior to share among all modules
  definition: function() {
    this.foo = 'bar';

    this.addInitializer(function() {
      console.log(this.moduleName + ': do startup stuff');
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

现在您可以创建简单实现此行为的模块,如下所示:

// Create a module with the default implementation
App.module('Module1', ModuleDefaults.definition);
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一个覆盖这个bevavior的模块:

// Create another module with the default implementation
App.module('Module2', ModuleDefaults.definition);

// Provide customizations to second module:
App.module('Module2', function() {
  // override existing behavior
  this.foo = 'baz';

  // add new behavior
  this.addFinalizer(function() {
    console.log(this.moduleName + ': cleanup stuff');
  });
});
Run Code Online (Sandbox Code Playgroud)

使用此技术,证明foo第二个模块的属性被覆盖:

App.start();                  // -> Module1: do startup stuff
                              // -> Module2: do startup stuff
console.log(App.Module1.foo); // -> bar
console.log(App.Module2.foo); // -> baz
App.Module1.stop();           // -> 
App.Module2.stop();           // -> Module2: cleanup stuff
Run Code Online (Sandbox Code Playgroud)