2013-08-29 70 views
1

我有一個通知工具欄,它是一個模塊。非常類似於Facebook本地應用程序中的通知工具欄。在此工具欄有3個區域:如何擴展MarionetteJS模塊以減少代碼複製

  • InvitesRegion
  • RequestsRegion
  • NotificationsRegion

這些地區的每一個包含自己的模塊(InvitesModule,RequestsModule,NotificationsModule)。每一個,但是,具有完全相同的功能:

  • 檢查新服務器(邀請|索取|通知)
  • 如果找到,更新相關聯的區
  • 然後一大堆的其他功能(點擊彈出的CollectionView等)

我可以寫一個單獨的模塊,說InvitesModule,並有我的另外兩個模塊擴展該模塊,這樣我就可以覆蓋我需要的變量?

感謝,並請讓我知道,如果我能得到更清晰的

回答

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'); 
    }); 
    } 
}; 

現在你可以創建一個簡單的實現這一行爲,像這樣的模塊:

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

或者你可以創建一個覆蓋該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'); 
    }); 
}); 

使用此技術證明第二個模塊的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 
+0

克里斯,感謝您花時間給我看。這是一個很好的解決方案 – validkeys

+0

不是問題。 :) –