【问题标题】:Ember.js How to get controller in needs which is nested controllerNameEmber.js 如何获取需要嵌套的控制器名称
【发布时间】: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
    }
});

【问题讨论】:

    标签: controller ember.js nested-routes


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2015-07-01
      • 2013-02-23
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多