是否可以在EmberJS组件中注入控制器或其他类?

时间:2016-06-22 13:27:57

标签: javascript ember.js dependency-injection

我试图在组件内部的一个控制器中使用一个方法但是必须出错。

我的路线/calendars有自己的控制器(controllers/calendars.js)和模板(templates/calendars.hbs

calendars.hbs内部,我已经实现了一系列组件,其中包含用于我的应用主屏幕和菜单的模板。在菜单中,我有最后一个组件应该调用日历'控制器方法。

控制器:

import Ember from 'ember';

export default Ember.Controller.extend({
  actions:{
    createCalendar: function(){
      console.log("app/controllers/calendars.js");
    }
  }

});

路线:

import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin,{
  model: function(params) {
    return [
      {id:"1", name:"Calendario de trabajo", shared:false, position: 0},
      {id:"2", name:"Calendario personal", shared:false, position: 1},
    ];
  },

  actions:{
    createCalendar: function(calendar){
      console.log("app/routes/calendars.js");
    }
  }
});

组件:

import Ember from 'ember';

export default Ember.Component.extend({

  calendars: Ember.inject.controller("calendars");

  actions: {
    createCalendar: function(){
      console.log("app/components/menu/calendar-dock-footer.js");
      this.calendars.createCalendar();
    }
  }
});

模板:

calendars.hbs

{{#main-template}}
  {{#link-to "calendars.new" (query-params posX=150 posY=50)}} Show me the money! {{/link-to}}
  {{outlet}}
  {{calendars.full-calendar size="calendar" action="createEvent"}}
{{/main-template}}

main-template.hbs(组件)

...
  {{menu.main-dock}}
...

main-dock.hbs(组件)

...
{{menu.calendar-dock-footer}} 
...

calendar-dock-footer.hbs(带按钮的组件)

<div class="row ht-calendar-footer-content">
    <button class="btn btn-sm btn-info" {{action 'createCalendar'}}>
        <label> Add Calendar</label>
    </button>
</div>

我试图将操作从calendars.hbs传递到带有按钮的组件,然后运行但我需要使用按钮从组件中调用calendars.js中的方法。

2 个答案:

答案 0 :(得分:2)

在组件的控制器中使用sendAction('createCalendar',params)。您的组件控制器无法了解您日历中的控制器。这是Mirza Memic在您的评论中提到的行动数据降低原则。您可以处理路线中的操作。如果您熟悉从组件级别(从组件 - &gt;路由)开始向数据库发送查询,则原则相同。

http://emberjs.com/api/classes/Ember.Component.html#method_sendAction

答案 1 :(得分:1)

您无法将控制器注入组件。当你想做这样的事情时,Ember宁愿你使用服务在两个实体之间进行通信。

或者,您可以在模板中实例化控制器时将控制器传递到组件中。这是一个骗子,但我喜欢这样做。

my-component controller=this

此外,您可以使用sendAction(),然后使用sendAction(),然后处理路径中的动作冒泡。

选择对你最有意义的方式。