我在Ember中创建一个应用程序,需要在不同站点上轻微变化而轻松复制。我本来想做的就是让我的Ember应用程序读取一个配置文件,然后相应地调整自己。
在我的情况下,我只需要更改一个控制器和一个附带的模板。在这个问题中,我只处理控制器。
我需要动态添加属性,然后才能在模板中调用。
我将如何做到这一点?
答案 0 :(得分:1)
这是我想出的:
var propertiesConfig = [
{name: 'newFunction1', arbitraryType: 'monkeys', numThings: 6 },
{name: 'newFunction2', arbitraryType: 'daysOfChristmas', numThings: 7 },
{name: 'newFunction3', arbitraryType: 'monkeys', numThings: 8 },
{name: 'newFunction4', arbitraryType: 'daysOfChristmas', numThings: 9 },
{name: 'newFunction5', arbitraryType: 'monkeys', numThings: 10 },
{name: 'newFunction6', arbitraryType: 'daysOfChristmas', numThings: 11 },
{name: 'newFunction7', arbitraryType: 'monkeys', numThings: 12 }
];
var MonkeyFunctionBuilder = function(buildData){
return function(){
if (buildData.numThings == 12) return 'Brad Pitt';
return buildData.numThings + ' monkeys';
}
};
var ChristmasDaysFunctionBuilder = function(buildData){
return function(){
return buildData.numThings + ' ' + daysOfChristmas[buildData.numThings]
}
};
var passedObject = {};
for(var i = 0; i < propertiesConfig.length; i++){
switch(propertiesConfig[i].arbitraryType){
case 'monkeys':
passedObject['monkeys'+propertiesConfig[i].numThings] =
new MonkeyFunctionBuilder(propertiesConfig[i]).property();
break;
case 'daysOfChristmas':
passedObject[propertiesConfig[i].name] =
new ChristmasDaysFunctionBuilder(propertiesConfig[i]).property();
break;
}
};
App.AnyController.reopen(passedObject);
propertiesConfig
代表问题中提到的配置文件。
我发现我需要创建构建器函数(实际上是Classes,如果我没有记错的话),以便在已创建的属性中保持更新,只要i
在我的内部发生更改for
循环。 这些功能&#39;名称需要以 CaptialLetter
开头,而不是javascript代码中常见的非大写首字母。
MonkeyFunctionBuilder
仅使用config对象中的数据来构建函数。 ChristmasDaysFunctionBuilder
使用在应用程序中其他位置声明的daysOfChristmas
对象中的数据。从理论上讲,可以从API调用,以便您的应用程序也可以从外部数据集中进行更改。小心:安全等。
另请注意,使用变量声明或从任何对象的属性名称获取数据时,必须使用括号(object[variableName]
)而不是常规点表示法(object.variableName
)。从another question on StackOverflow找到了。
在您看到循环的最后一段代码中,您可以执行操作数据所需的任何操作。在我的示例中,我选择使用propertiesConfig[i].name
声明一些App.AnyController
属性名称,然后使用propertiesConfig[i].numThings
(以及关键字monkey
)来声明其他属性名称。
AnyController
上的Ember Debugger中的结果如下所示: