我想基于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"});
但这不实用,我无法弄清楚构造函数对象的存储位置。
提前致谢。
答案 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);
}
})
});
答案 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,因此我无法想象这在真正的应用程序中是安全的。