ember.js:如何使用generateController初始化控制器

时间:2013-08-19 09:03:42

标签: ember.js ember-data

我需要插入视图&来自多个其他路由中的路由categories的控制器,而不将它们嵌套在categories路由中(因为我希望保持URL独立)。

所以,我使用我从现有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控制器:

  

断言失败:无法找到路径“类别”的控制器。确保此路线存在且至少已输入一次。如果必须在不输入路径的情况下初始化控制器,请使用`generateController`。

好警告:)我希望所有框架都那么聪明!所以我试图手动生成该控制器......但是如何?

我试过了:

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

和静态版本:

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

这似乎不是正确的方法。有什么帮助吗?

3 个答案:

答案 0 :(得分: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'
    });
  }
});

你可以在模型钩子里做这些东西。

答案 1 :(得分: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"} 

希望它有所帮助。

答案 2 :(得分: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以确保它只执行一次。