Ember.js中的动态控制器

时间:2015-03-26 05:41:43

标签: ember.js

我想基于JSON对象的顶级键创建一些动态控制器,其中第二级键成为视图的变量。这可能吗?

E.g。

App.dat = { "First": {Var1: "x", Var2: "y"}, "Second": {Var3: "z"}}

然后我希望自动创建FirstController,SecondController等,然后在我的视图中访问{{Var1}},{{Var2}}和{{Var3}}。

路线运作良好:

App.Router.map(function() {
  this.route('data');
  for(var key in App.dat) {
    this.route(key);
  }
});

但是我无法让控制器工作。我最接近的是一些hacky eval代码:

for(var key in App.dat) {
  console.log("App." + key + "Controller = Ember.Controller.extend();");
  eval("App." + key + "Controller = Ember.Controller.extend();");
  Ember.$.each(eval("App.dat."+key), function(kkey,v) {
    console.log("App." + key + "Controller." + kkey + " = '" + v + "';");
    eval("App." + key + "Controller." + kkey + " = '" + v + "';");
  });
}

这导致以下评估:

App.FirstController = Ember.Controller.extend();
App.FirstController.Var1 = "x";
App.FirstController.Var2 = "y";
App.SecondController = Ember.Controller.extend();
App.FirstController.Var2 = "z";

但我显然遗漏了一些内容,因为我无法从视图中访问{{x}},{{y}}或{{z}}。我知道为视图实例化变量的正确方法是使用构造函数对象,如:

App.FirstController = Ember.Controller.extend({Var1: "x", Var2: "y"});

但这不实用,我无法弄清楚构造函数对象的存储位置。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以覆盖Ember.DefaultResolver's resolveController方法。哪个负责查找控制器类。

App = Ember.Application.create({
  Resolver: Ember.DefaultResolver.extend({
    resolveController: function(parsedName) {
      var props = Ember.get(App.dat, parsedName.name);

      if (!Ember.isNone(props)){
        return Ember.Controller.extend(props);
      }

      return this._super(parsedName);
    }
  })
});

jsbin

答案 1 :(得分:0)

经过一些小心的bug搜索后,下面的代码运行正常:

for(var key in App.dat) {
  properties = Array();
  Ember.$.each(eval("App.dat."+key), function(kkey,v) {
    properties.push(kkey + ": '" + v + "'")
  });
  console.log("App." + key + "Controller = Ember.ObjectController.extend({" +properties + "})");
  eval("App." + key + "Controller = Ember.ObjectController.extend({"+ properties + "})");
}

这样做的方式是否比通过eval()所有内容更少?请记住,这些数据来自JSON,因此我无法想象这在真正的应用程序中是安全的。