2015-03-26 5 views
2

Я хочу сделать некоторые динамические контроллеры на основе ключей верхнего уровня объекта JSON, где ключи второго уровня становятся переменными для представления. Это возможно?Динамические контроллеры в Ember.js

E.g.

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

я тогда хочу иметь FirstController, SecondController и т.д. создается автоматически и затем иметь возможность доступа {{Var1}}, {{}} Переменная2 и {{}} 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"; 

Но я явно что-то отсутствует, потому что не может получить доступ {{х}} , {{y}} или {{z}} из представления. Я знаю правильный способ создания экземпляра переменных для взгляда с объектом конструктора, как:

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

Но это не практично, и я не могу понять, где объект конструктора получает хранится.

Заранее спасибо.

+0

Почему вы простирающийся маршрут для контроллера? – Vaibhav

+0

Потому что я идиот, и это было почти 6 утра, и я ошибся. Проблема остается, хотя: как вы можете расширять переменные для представления без использования объекта создания экземпляра контроллера? –

+0

что вы пытаетесь сделать здесь? обычно данные json переводятся в модели, а не контроллеры. –

ответ

0

После аккуратной охоты ошибки, следующий код работает отлично:

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 + "})"); 
} 

Есть ли менее Hacky способ сделать это, чем Eval() ИНГ все? Помните, что эти данные поступают от JSON, поэтому я не могу представить, что это было бы безопасно в реальном приложении.

1

Вы можете переопределить Ember.DefaultResolver's resolveController method. Это отвечает за поиск классов контроллера.

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

Смежные вопросы