【问题标题】:How to get an instance of a controller in Ember.js?如何在 Ember.js 中获取控制器的实例?
【发布时间】:2012-10-27 05:56:35
【问题描述】:

我正在尝试访问已使用 App.initialize() 自动连接的控制器实例;

我已经尝试了以下方法,但它返回的是一个类而不是一个实例。

Ember.get('App.router.invitesController')

【问题讨论】:

    标签: ember.js ember-old-router


    【解决方案1】:

    我的博客上有一篇关于这个确切主题的快速帖子。这是一个有点大的不同方法,但似乎适用于 Ember.js RC1。

    查看:http://emersonlackey.com/article/emberjs-instance-of-controller-and-views

    基本的想法是做这样的事情:

    var myController = window.App.__container__.lookup('controller:Posts');
    

    【讨论】:

    • Yehuda 对此有一些有趣的 cmets。他实际上将 container 从容器更改为因为他不希望人们使用这个“私有”api。我需要从我的主 App 应用程序访问控制器,但没有其他选择。实际上,翻阅 discourse 的源代码,他们也在做这样的事情。 Discourse.__container__.lookup('controller:modal').get('currentView'); (Discourse 是由 Steve Atwood 创建的 Stack Overflow,所以现在看来​​它是唯一的选择。
    • 它... wokrs,谢谢。但说真的,我们没有什么比这更糟糕的了?这样做?
    【解决方案2】:

    此答案适用于 RC1/RC2。

    现在您可以使用needs 声明来使所需的控制器可访问。这是一个例子:

    假设我想从我的SettingsController 从我的ApplicationController 中获取一些东西。我可以做到以下几点:

    App.SettingsController = Ember.Controller.extend({
      isPublic: true
    });
    
    App.ApplicationController = Ember.Controller.extend({
      needs: 'settings',
      isPublicBinding: 'controllers.settings.isPublic'
    });
    

    现在在我的ApplicationController 的上下文中,我可以做this.get('isPublic')

    【讨论】:

    • 我通过 needs: ['settings'] 使用最新的 EmberJS 使其工作。
    【解决方案3】:

    您可以通过router.get('invitesController') 访问路由器中的操作内的控制器实例,请参阅http://jsfiddle.net/pangratz666/Pk4k2/

    App.InvitesController = Ember.ArrayController.extend();
    
    App.Router = Ember.Router.extend({
        root: Ember.Route.extend({
            route: '/',
            index: Ember.Route.extend({
                route: '/',
                connectOutlets: function(router, context) {
                    var invitesController = router.get('invitesController');
                },
                anAction: function(router) {
                    var invitesController = router.get('invitesController');
                }
            })
        })
    });​
    

    【讨论】:

      【解决方案4】:

      您可以使用lookup method of Application instance 按名称访问任何控制器实例。 要获取应用程序实例,您可以从任何路由或控制器使用getOwner

      const controllerName = 'invites';
      Ember.getOwner(this).lookup(`controller:${controllerName}`));
      

      在 Ember 2.4 - 3.4 中为我工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多