Dynamic 在Ember.js中向控制器动态添加属性

Dynamic 在Ember.js中向控制器动态添加属性,dynamic,ember.js,controller,Dynamic,Ember.js,Controller,我正在Ember中创建一个应用程序,该应用程序需要在不同的站点上轻松复制,并且略有不同。基本上,我想做的是让我的余烬应用程序读取一个配置文件,然后进行相应的调整 在我的例子中,我只需要更改一个控制器和一个附带的模板。在这个问题上,我只处理控制器 我需要动态地向控制器添加属性,然后可以在模板中调用该属性 我该怎么做呢?以下是我的想法: var propertiesConfig = [ {name: 'newFunction1', arbitraryType: 'monkeys',

我正在Ember中创建一个应用程序,该应用程序需要在不同的站点上轻松复制,并且略有不同。基本上,我想做的是让我的余烬应用程序读取一个配置文件,然后进行相应的调整

在我的例子中,我只需要更改一个控制器和一个附带的模板。在这个问题上,我只处理控制器

我需要动态地向控制器添加属性,然后可以在模板中调用该属性


我该怎么做呢?

以下是我的想法:

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中的控制器添加属性。该文件将给我一个类型和名称,我需要创建任意数量的属性来完成任意数量的事情(基于类型),并以我知道如何在模板中访问它们的方式对它们进行命名。