2013-08-19 4 views
2

мне нужно вставить контроллер вида & из маршрута categories в нескольких других маршрутах, не гнездятся их в этом categories маршрута (потому что я хочу, чтобы сохранить URL-независимыми).ember.js: Как инициализировать контроллер с generateController

Итак, я рендеринг categories шаблона, в основную application один, на выходе topbar с помощью контроллера я получаю от моего существующего categories маршрута.

App.PostRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
     this.render(); 
     this.render('categories', { 
      outlet: 'topbar', 
      into: 'application', 
      controller: this.controllerFor('categories') 
     }); 
    } 
}); 

Когда я посещаю маршрут categories, все работает нормально! Я даже просматриваю другие маршруты. Но если я получить доступ к первому любому другому маршруту, контроллер categories, кажется, не будет создан:

Assertion не удался: Контроллер для маршрута «категории»»не может быть найден. Убедитесь, что этот маршрут существует и уже был введен хотя бы один раз. Если вы должны запрограммировать контроллер без ввода маршрута, используйте `generateController`.

Хорошее предупреждение :) Я хочу, чтобы все рамки были такими умными! Поэтому я пытаюсь создать этот контроллер вручную ... Но как?

Я пробовал:

App.CategoriesRoute.create().generateController('categories', App.Category) 

и статическую версию:

App.CategoriesRoute.generateController('categories', App.Category) 

Это не кажется, правильный способ сделать. Любая помощь, пожалуйста?

+0

Это поведение было введено с RC7, поэтому оно действительно новое, и я еще не пробовал себя. Вы уже пробовали этот.generateController («категории»)? – mavilein

+0

Вы наконец получили свой контроллер? – intuitivepixel

+0

Да, извините! Хорошо работает теперь благодаря вам, ребята, все :) И только что завершил ответ @ seenivasan. –

ответ

3

Это что-то среднее с нашим другом IntuitivePixel.

App.PostRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render(); 

    //assigning the model... 
    var context = ['a','b','c','d']; 
    var instance = Em.generateController(this.get('container'),'categories',context); 
    instance.set('content',context); 

    this.render('categories', { 
     outlet: 'topbar', 
     into: 'application' 
    }); 
    } 
}); 

Вы можете сделать этот материал в самой модели крючка.

+0

Проверьте мой ответ, чтобы получить рабочий код. Спасибо за ваше предложение @seenivasan! –

+0

@MichaMazaheri Спасибо за обмен. Это кажется очень логичным. – seenivasan

2

Как @mavilein уже говорилось в комментарии, это поведение было недавно введено с Rc7 выпуска и this.controllerFor('...'); больше плачевно не автоматически генерирует соответствующий контроллер для вас, так что я думаю, генерируя CategoriesController явно (в маршрутах init метод, например), он должен работать:

App.CategoriesRoute = Ember.Route.extend({ 
    init: function() { 
    this._super(); 
    this.generateController('categories'); 
}); 

Запустите пример и проверьте консоль: http://jsbin.com/odosoy/62/edit вы увидите что-то вроде этого:

generated -> controller:categories Object {fullName: "controller:categories"} 

Надеюсь, это поможет.

1

Чтобы завершить ответы от @seenivasan и @IntuitivePixel, вот что я сделал, и это работает прекрасно:

App.PostRoute = Ember.Route.extend({ 
    init: function() { 
    this._super(); 
    this.generateController('categories'); 
    }, 
    renderTemplate: function() { 
    this.render(); 

    //getting the generated controller 
    var categoriesController = this.controllerFor('categories'); 

    //assigning the model 
    categoriesController.set('content', App.PostCategory.find()); 

    this.render('categories', { 
     outlet: 'topbar', 
     into: 'application', 
     controller: categoriesController 
    }); 
    } 
}); 

Я думаю, что это лучше назвать generateController в функции init, чтобы убедиться, что это только один раз.