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

时间:2014-04-02 19:10:15

标签: dynamic ember.js controller

我在Ember中创建一个应用程序,需要在不同站点上轻微变化而轻松复制。我本来想做的就是让我的Ember应用程序读取一个配置文件,然后相应地调整自己。

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

我需要动态添加属性,然后才能在模板中调用。

我将如何做到这一点?

1 个答案:

答案 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中的结果如下所示:

screenshot of Ember Debugger results