15

我想用this.get('controllers.pack.query');进去 App.PackQueryControllerApp.PackController但失败了。

我认为问题在于 Ember 在尝试获取控制器时packpack.query使用它。controllerName虽然我可以通过 获取控制器this.controllerFor('pack.query'),但 Ember 说它已被弃用,请needs改用

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

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

3 回答 3

35

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 弃用。我在下面留下了旧答案,但除非您使用旧版本的 Ember,否则不应使用。


[已弃用] 使用以下方法从其他控制器访问嵌套控制器needs

needs在控制器上设置:

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

然后使用以下命令访问它:

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

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

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

您可以使用如下方式从 Route 访问嵌套控制器controllerFor

this.controllerFor('pack/query')
于 2014-08-07T05:52:48.283 回答
16

您应该为此使用驼峰式大小写,而不是点表示法。

你的包控制器应该是

 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
   }
});
于 2013-06-21T05:24:04.673 回答
0

相同用例有更新的注入语法

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

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

于 2015-07-24T11:32:39.273 回答