Dynamic 在Ember.js中向控制器动态添加属性
我正在Ember中创建一个应用程序,该应用程序需要在不同的站点上轻松复制,并且略有不同。基本上,我想做的是让我的余烬应用程序读取一个配置文件,然后进行相应的调整 在我的例子中,我只需要更改一个控制器和一个附带的模板。在这个问题上,我只处理控制器 我需要动态地向控制器添加属性,然后可以在模板中调用该属性Dynamic 在Ember.js中向控制器动态添加属性,dynamic,ember.js,controller,Dynamic,Ember.js,Controller,我正在Ember中创建一个应用程序,该应用程序需要在不同的站点上轻松复制,并且略有不同。基本上,我想做的是让我的余烬应用程序读取一个配置文件,然后进行相应的调整 在我的例子中,我只需要更改一个控制器和一个附带的模板。在这个问题上,我只处理控制器 我需要动态地向控制器添加属性,然后可以在模板中调用该属性 我该怎么做呢?以下是我的想法: var propertiesConfig = [ {name: 'newFunction1', arbitraryType: 'monkeys',
我该怎么做呢?以下是我的想法:
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);
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=函数(buildData){
返回函数(){
if(buildData.numThings==12)返回'Brad Pitt';
返回buildData.numThings+“monkeys”;
}
};
var ChristmasDaysFunctionBuilder=函数(buildData){
返回函数(){
返回buildData.numThings+''+圣诞节当天[buildData.numThings]
}
};
var passedObject={};
对于(变量i=0;i
propertiesConfig
代表问题中提到的我的配置文件
我发现我需要创建生成器函数(如果我没有弄错的话,实际上是类),以防止在我的for
循环中I
发生更改时,已经创建的属性上的值得到更新这些函数的名称需要以大写字母
开头,而不是通常在javascript代码中看到的未大写字母开头
MonkeyFunctionBuilder
仅使用配置对象中的数据来构建函数ChristmasDaysFunctionBuilder
使用应用程序中其他地方声明的daysOfChristmas
对象中的数据。理论上,这可以从API调用,以便您的应用程序也可以从外部数据集更改。小心:安全等
还要注意,当使用变量声明或从任何对象的属性名称获取数据时,必须使用括号(object[variableName]
)而不是普通的点符号(object.variableName
)。我是从你那里发现的
在看到循环的最后一段代码中,您可以执行任何操作数据所需的操作。在我的示例中,我选择使用propertiesConfig[I].name
来声明一些App.AnyController
属性名称,然后使用propertiesConfig[I].numThings
(以及关键字monkey
)来声明其他属性名称
AnyController
上的Ember调试器内部的结果如下所示:
这里的重新开放声明是与余烬有关的唯一内容,也是您实际提出的问题的答案。您用来消化“propertiesConfig”并生成传递到reopen语句中的对象的方法由您决定。很难知道您的需求或您试图在本代码中实现的目标的背景,因为您在最初的问题或回答中没有真正解释:/我甚至不知道该问什么问题。我想在运行时根据配置文件向Ember中的控制器添加属性。该文件将给我一个类型和名称,我需要创建任意数量的属性来完成任意数量的事情(基于类型),并以我知道如何在模板中访问它们的方式对它们进行命名。