我目前正在使用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,因为所需文件根据平台动态变化。我称之为多态性。
答案 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;
}