如何使requirejs以多态方式加载模块?

时间:2014-03-14 07:36:09

标签: javascript backbone.js requirejs cordova-3

我目前正在使用Cordova 3.4.0,Requirejs和Backbone开发单页应用程序。在将我的应用程序从iPhone移植到iPad时,我需要在某些视图中更改某些功能并保持其他部分不变。

为了保持最小化,我的解决方案是为每个需要更改的视图创建新对象,从原始视图继承所有属性并仅覆盖必要的功能。

为此,我需要配置Requirejs,以便在iPad中,如果我需要,例如' user / view / edit-profile.js ',它将检查是否有' user / ipad / view / edit-profile.js '文件,如果有,则需要它,否则需要' user / view / edit-profile.js'

我尝试了i18n,但这种情况并不正确。我想出了为requirejs创建一个新插件来完成任务的想法。

是否有人对我的问题有任何建议?

Btw,因为所需文件根据平台动态变化。我称之为多态性。

2 个答案:

答案 0 :(得分: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加载模块。我使用这种代码来加载名称在运行时计算的模块。

答案 1 :(得分: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;
}