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类,您通常会扩展它们,以在应用程序名称空间中获得这些类的版本。如果它们不提供余烬类,您可以像在自己的余烬类中一样使用它们。