Ember.js 如何获取需要嵌套的控制器名称

Posted

技术标签:

【中文标题】Ember.js 如何获取需要嵌套的控制器名称【英文标题】:Ember.js How to get controller in needs which is nested controllerName 【发布时间】:2013-06-18 03:05:24 【问题描述】:

我想用this.get('controllers.pack.query');来获取 App.PackQueryControllerApp.PackController 中,但失败了。

我认为问题在于 Ember 使用 pack 而不是 pack.query 作为 controllerName 当它试图获取控制器时。 虽然我可以通过this.controllerFor('pack.query')获得控制器, 但 Ember 表示已弃用,请改用 needs

我的路由器地图如下所示,我在App.PackController 中定义了needs: ['pack.query']

App.Router.map(function () 
    this.resource('pack', function () 
        this.route('index', path: '/:pack_id')
        this.route('query');
    );
);

App.PackController = Ember.ObjectController.extend(
    needs: ['pack.query'],
    queryPack: function () 
        var packQueryCtrller = this.get('controllers.pack.query');            

        Ember.debug('packQueryCtrller: ' + packQueryCtrller);
        //DEBUG: packQueryCtrller: undefined

        packQueryCtrller.queryPack(); //faild packQuery is undefined
    
);

App.PackQueryController = Ember.ArrayController.extend(
    queryPack: function (queryKey) 
        //...do query pack
    
);

【问题讨论】:

【参考方案1】:

你应该使用驼峰式,而不是点表示法。

你的包控制器应该是

 App.PackController = Ember.ObjectController.extend(
   needs: ['packQuery'],
   queryPack: function () 
     var packQueryCtrller = this.get('controllers.packQuery');            

     Ember.debug('packQueryCtrller: ' + packQueryCtrller);
     //DEBUG: packQueryCtrller: undefined

     packQueryCtrller.queryPack(); //faild packQuery is undefined
   
);

【讨论】:

这在 ember-cli 0.2.3 后不起作用。请参阅@rog 的答案以获得有效的解决方案。【参考方案2】:

Ember.inject.controller() 应该用于访问控制器。像这样使用它:

设置

...
myController: Ember.inject.controller('pack'),
nestedController: Ember.inject.controller('pack/query')
...

获取

...
this.get('myController');
this.get('nestedController');
...

上面的答案已更新以反映 Ember 1.13.5(2015 年 7 月 19 日发布)中的 needs deprecation。我在下面留下了旧答案,但除非您使用的是旧版本的 Ember,否则不应使用。


[已弃用] 使用 needs 从其他控制器访问嵌套控制器:

在控制器上设置needs

...
needs: ['pack/query'],
...

然后使用:

this.get('controllers.pack/query');

[已弃用] 从路由访问嵌套控制器:

理想情况下,actions 应该放在路由上。如果您在控制器上的actions 中使用上述needs 模式,请考虑重构。

您可以使用controllerFor 从路由访问嵌套控制器,如下所示:

this.controllerFor('pack/query')

【讨论】:

再次更新以反映新版本(Ember 1.11.1 和 ember-cli 0.2.3) 谢谢你,关于这个主题的信息令人惊讶地少,而且似乎只是在黑暗中盲目地跌跌撞撞。 再次更新以反映新版本(Ember 1.13.5)引入了对原始答案的弃用。【参考方案3】:

对于相同的用例有一个更新的注入语法

accountQueueController: Ember.inject.controller('account/queue'),
...
this.get('accountQueueController.model.myProperty')

来源:http://discuss.emberjs.com/t/needs-with-nested-controller/8083/6

【讨论】:

以上是关于Ember.js 如何获取需要嵌套的控制器名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ember.js 访问嵌套索引路由中的父模型?

Ember.js 使用路由器架构获取父路由的控制器

检查Ember.js:获取对象的类型(Class)?

Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

Ember.js:从嵌套路由调用 ApplicationRoute 的操作

如何在 Ember.js 中获取复选框状态?