Javascript Ember.js依赖注入

Javascript Ember.js依赖注入,javascript,ember.js,coffeescript,Javascript,Ember.js,Coffeescript,假设我有这个控制器 MyApp.LayoutFooterController = Ember.ObjectController.extend formData: name: null, phone: null, message: null cleanFormData: -> @set('formData.name', null) @set('formData.phone', null) @set('formData.message'

假设我有这个控制器

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.js dependecy注入(我猜是服务定位器)容器注入其他lib或对象

也许,我做得一点也不好

编辑

当我查看Ember's时,我找到了一个解决方案:

Ember.Application.initializer
  name: 'contact'

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

但是这是干净的吗?

一般来说,你不想自己连接所有的部件,你想在你的控制器中使用
需要
,让余烬为你做这件事。我完全不确定Ember是如何处理3级类名和2级类名的,所以我将用两级来演示。(
MyApp.ApiContact
而不是
MyApp.Api.Contact
)另外,
send
是一种本机的余烬方法,存在于所有(或几乎所有)对象上,因此您希望改为使用类似于
sendMessage
的方法,以避免出现难以诊断的冲突。在您告诉Ember您的控制器
需要
apiContact
后,您可以调用
this.get('controllers.apiContact')
来获取它

MyApp.LayoutFooterController = Ember.ObjectController.extend({
  needs : ['apiContact'],
  // All your other stuff here
  sendMessage : function(){
    this.get('controllers.apiContact').sendMessage(...);
  }
});

一般来说,您不想自己连接所有的部件,您希望在控制器中使用
needs
,让Ember为您完成这项工作。我完全不确定Ember是如何处理3级类名和2级类名的,所以我将用两级来演示。(
MyApp.ApiContact
而不是
MyApp.Api.Contact
)另外,
send
是一种本机的余烬方法,存在于所有(或几乎所有)对象上,因此您希望改为使用类似于
sendMessage
的方法,以避免出现难以诊断的冲突。在您告诉Ember您的控制器
需要
apiContact
后,您可以调用
this.get('controllers.apiContact')
来获取它

MyApp.LayoutFooterController = Ember.ObjectController.extend({
  needs : ['apiContact'],
  // All your other stuff here
  sendMessage : function(){
    this.get('controllers.apiContact').sendMessage(...);
  }
});

我也想知道这件事。这个话题在文档里根本不存在。我也很想知道。我相信,这与我所做的非常相似(也许更好的方法)。我知道(或者更好,我猜)如果
MyApp.ApiContact
需要一些自己的依赖项,我也可以在
needs
中提到它们。但所有这些依赖项都必须在MyApp
范围内,对吗?那么一些第三方库呢?我得给他们写包装纸?我认为非常常见的例子是jQuery(如果我不想使用全局空间的话)。每个控制器都应该有自己的
需要
数组。您可以通过这种方式构建相关控制器的树。我不知道你所说的第三方库是什么意思。如果这些库提供了Ember类,您通常会
扩展它们,以在应用程序名称空间中获得这些类的版本。如果他们不提供灰烬类,你只需要在你自己的灰烬类中正常使用它们。我相信,这与我所做的非常相似(也许更好)。我知道(或者更好,我猜)如果
MyApp.ApiContact
需要一些自己的依赖项,我也可以在
needs
中提到它们。但所有这些依赖项都必须在MyApp
范围内,对吗?那么一些第三方库呢?我得给他们写包装纸?我认为非常常见的例子是jQuery(如果我不想使用全局空间的话)。每个控制器都应该有自己的
需要
数组。您可以通过这种方式构建相关控制器的树。我不知道你所说的第三方库是什么意思。如果这些库提供了Ember类,您通常会
扩展它们,以在应用程序名称空间中获得这些类的版本。如果它们不提供余烬类,您可以像在自己的余烬类中一样使用它们。