【问题标题】:Ember.js - How do I insert a controller?Ember.js - 如何插入控制器?
【发布时间】:2013-08-04 18:41:49
【问题描述】:

所以我对 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 中的模型/视图模式感到满意,但我在确定控制器适合的位置时遇到了一些困难。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

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

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

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

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

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

    方法 1

    假设你有一个路由并且你连接到setupController,如果你在这里尝试用this.controllerFor('lonely');请求你LonelyController,这将使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
      }
    });
    

    方法2

    让 ember 自动实例化 LonelyController 的另一种可能方法是在另一个控制器中定义与 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
      }
    });
    

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

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

    希望对你有帮助。

    【讨论】:

    • 再次感谢intuitivepixel,这非常有用。根据您的建议,我终于有了一些工作。
    • @bluepnume,很高兴能帮上忙 :)
    • 一个更快速的问题,当我听到你的耳朵时......我正在将控制器绑定到我的视图,如下所示:{{#with controllers.account}} {{view Rad.GlobalAccountView controllerBinding="this" tagName=""}} {{/with}} 这可以吗,或者是否有一种首选方式可以让视图访问控制器?
    猜你喜欢
    • 2013-09-13
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多