1

假设我有这个控制器

MyApp.LayoutFooterController = Ember.ObjectController.extend
  formData:
    name: null,
    phone: null,
    message: null

  cleanFormData: ->
    @set('formData.name', null)
    @set('formData.phone', null)
    @set('formData.message', null)

  send: () ->
    @container.lookup('api:contact').send(
       @get('formData.name'),
       @get('formData.phone'),
       @get('formData.message')
    )
    @cleanFormData()

为此,我创建了服务类

MyApp.Api ||= {}
MyApp.Api.Contact = Ember.Object.extend
  init(@$, @anotherDep) ->
  send: (name, phone, message) ->
    console.log name, phone, message

和初始化器

Ember.Application.initializer
  name: 'contact'

  initialize: (container, application) ->
    container.register 'api:contact', MyApp.Api.Contact

问题是,我无法弄清楚如何设置容器以init(@$, @anotherDep)通过 Ember 容器解决我的服务类依赖项。

谁能给我解释一下,如何使用 Ember.js 依赖注入(或服务定位器,我猜)容器注入其他库或对象?

也许,我根本做得不好。

编辑

当我查看 Ember 的容器源代码时,我找到了一个解决方案:

Ember.Application.initializer
  name: 'contact'

  initialize: (container, application) ->
    container.register 'api:contact', { create: () -> new MyApp.Api.Contact(application.$) }

但这干净吗?

4

1 回答 1

1

通常,您不想自己连接所有部件,而是希望needs在控制器中使用让 Ember 为您完成。我完全不确定 Ember 如何处理 3 个级别的类名而不是 2 个,所以我将只演示两个级别。(MyApp.ApiContact而不是MyApp.Api.Contact。)此外,send它是一种本机 Ember 方法,存在于所有(或几乎所有)对象上,因此您希望使用类似的方法sendMessage,以免最终难以诊断冲突。在你告诉 Ember 你的控制器needs apiContact后,你可以打电话this.get('controllers.apiContact')来获取它。

MyApp.LayoutFooterController = Ember.ObjectController.extend({
  needs : ['apiContact'],
  // All your other stuff here
  sendMessage : function(){
    this.get('controllers.apiContact').sendMessage(...);
  }
});
于 2013-09-10T03:13:41.330 回答