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 レベルのクラス名をどのように処理するのかまったくわからないので、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 に答える