2

所以我对 Ember 文档的理解是视图/控制器/模型的模式如下:

[view] <- [controller] <- [model]

(视图消费控制器消费模型)

在我之前使用 Ember 的经验中,我设置了一个视图来使用模型,如下所示:

{{#with blogpost}}
    {{#view MyApp.BlogPostView contentBinding="this"}}
        <h1>{{title}}</h1>

        <p>{{content}}</p>
    {{/view}}
{{/with}}

现在说我创建一个控制器:

MyApp.BlogPostController = Ember.BlogPostController.extend()

我在哪里初始化这个控制器?

查看 Ember 文档,如果控制器与路由相关联,这似乎会自动发生,但如果我只想要一个将视图和模型联系在一起的临时控制器怎么办?这可能适用于我页面上的任意组件。

我是否负责实例化控制器?我应该使用某种controllerBinding属性吗?它会用我的模型自动实例化,还是用我的视图自动实例化?

任何建议表示赞赏;我对 Ember 中的模型/视图模式感到满意,但在确定控制器适合的位置时遇到了一些困难。

4

1 回答 1

3

查看 Ember 文档,如果控制器与路由相关联,这似乎会自动发生

这是正确的,与路由关联的控制器将在需要时由 ember 自动实例化。

但是如果我只想要一个将视图和模型联系在一起的临时控制器呢?这可能适用于我页面上的任意组件。我是否负责实例化控制器?我应该使用某种控制器绑定属性吗?它会用我的模型自动实例化,还是用我的视图自动实例化?

有不同的方法可以让您的任意控制器通过 ember 自动实例化,而无需自己动手。

对于示例,假设您有一个不与任何名为的路由关联的控制器LonelyController

App.LonelyController = Ember.ArrayController.extend({
  content: ['foo', 'bar', 'baz']
});

方法一

假设您有一条路线并且您连接到setupController,如果您尝试在这里请求您LonelyControllerthis.controllerFor('lonely');这将使 ember 为您实例化它:

App.IndexRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this.controllerFor('lonely').get('content');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

方法二

另一种让LonelyControllerember 自动实例化的可能方法是needs在另一个控制器中定义与 API 的依赖关系:

App.IndexController = Ember.ObjectController.extend({
  needs: 'lonely',
  someAction: function() {
    this.get('controllers.lonely').get('content');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

使用needsAPI,您还可以执行以下操作:

App.IndexController = Ember.ObjectController.extend({
  needs: 'lonely',
  lonelysContentBinding: 'controllers.lonely.content',
  someAction: function() {
    this.get('lonelysContent');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

还有一些上述方法的其他组合可以让您LonelyController自动实例化,但我想现在应该更清楚了。

最后一个提示:要了解 ember 在后台自动创建的内容,您还可以启用生成日志记录以在控制台中观察这一点,这非常有帮助,方法是:

var App = Ember.Application.create({
  LOG_ACTIVE_GENERATION: true
});

希望能帮助到你。

于 2013-08-04T21:54:15.020 回答