2014-03-14 27 views
0

我目前正在開發一個使用Cordova 3.4.0 Requirejs和Backbone的單頁面應用程序。將應用程序從iPhone移植到iPad時,我需要在某些視圖中更改某些功能,並保持其他部分不變。如何讓requirejs以多態方式加載模塊?

爲了保持最小變化,我的解決方案是爲每個需要更改的視圖創建新對象,從原始視圖繼承所有屬性並僅覆蓋必要的功能。

要做到這一點,我需要配置Requirejs這樣在iPad上,如果我需要,例如,「用戶/查看/編輯profile.js」,它會檢查是否有一個'用戶/ ipad/view/edit-profile.js'文件,如果有的話,需要它,否則需要'user/view/edit-profile.js'

我試過i18n,但是這種情況並不正確。我想出了一個爲requirejs創建新插件來完成任務的想法。

有沒有人對我的問題有任何建議?

btw,由於所需文件根據平臺動態變化。我稱之爲多態。

回答

1

你可以使用path fallbacks

paths: { 
    "user/view/edit-profile": ["user/ipad/view/edit-profile", "user/view/edit-profile"] 
} 

以上會使RequireJS嘗試先加載ipad變種。如果你開發應用程序,你最終與邏輯複雜,回退,您可以用errbacks

function onload(module) { 
    // Whatever you want to do... 
}; 

require([module_a], onload, function (err) { 
    require([module_b], onload); 
}); 

上面的代碼將嘗試從module_a加載一個模塊,然後從module_b。我使用這種類型的代碼來加載具有在運行時計算的名稱的模塊。

+0

感謝您的幫助。然而,我的背景是我們已經完成了我們的iPhone應用程序,這是一個巨大的項目,並且經過了仔細的測試,所以我們不想觸摸當前運行良好的iPhone應用程序的源代碼。它使我們不能使用你的第二個建議。 在您的第一個建議中,我們必須搜索所有必需的模塊,並在config文件中將其路徑與適當的回退一起設置。這會增加更多模塊的複雜性。 –

0

因爲每個模塊都是一個Backbone View,所以我想出了一個解決方案,它將覆蓋Backbone View的擴展功能,以根據ipad,iphone或android依賴關係的存在返回修改的對象。

該解決方案將需要,如果基本視圖有iPad版,它具有依賴性聲明在iPad版本中,延伸功能將由iPad的視圖擴展現有的視圖,以便在iPad視圖可以繼承基本視圖的所有屬性並只覆蓋必要的功能。

我將視圖命名爲PolyplatformView。每個視圖都需要聲明其ID,例如:user/view/edit-profile

Backbone.PolyplatformView = Backbone.View.extend({ 
}); 

Backbone.PolyplatformView.extend = function() { 
    if(arguments[0].moduleId) { 
     var extendPropsPath = arguments[0].moduleId.replace('/', '/' + constants.platform_name + '/'); 
     // turn user/view/edit-profile -> user/ipad/view/edit-profile 

     if(require.defined(extendPropsPath)) { 
      _.extend(arguments[0], require(extendPropsPath)); 
     } 

    } else { 
     console.warn('No module Id in polyplatform view -> cannot extend its parent'); 
    } 
    var extended = Backbone.View.extend.apply(this, arguments); 

    return extended; 
}