Ember.js: ヘルパーに注入する

作成日 2015年05月04日  ·  6コメント  ·  ソース: emberjs/ember.js

私はこれを持っています:

export function initialize(container, application) {
    application.inject('component', 'store', 'store:main');
    application.inject('component', 'application', 'application:main');
    application.inject('component', 'applicationController', 'controller:application');
    application.inject('helper', 'applicationController', 'controller:application');
    application.inject('model:device', 'application', 'application:main');
    application.inject('model:room', 'application', 'application:main');
    application.inject('model:setting', 'application', 'application:main');
    application.inject('route:application', 'application', 'application:main');
    application.inject('transform', 'application', 'application:main');
}

export default {
  name: 'injections',
  initialize: initialize
};

知らせ:

application.inject('helper', 'applicationController', 'controller:application');

ただし、ヘルパーでは、 this.get('applicationController')は定義されていません。

import Ember from 'ember';
import environment from '../utils/environment';

export function staticImg(path, options) {
    if (path) {
        var staticRoot = this.get('applicationController').get('model.staticRoot');
        return new Ember.Handlebars.SafeString('<img src="' + environment.staticHost() + staticRoot + path + '" class="' + ( options.hash.classNames || "" ) + '">');
    }
    else {
        return "";
    }
}

export default Ember.Handlebars.makeBoundHelper(staticImg);

ドキュメントでは、ヘルパーに注入できると書かれていますが、この正確なセットアップは他のフレームワーククラスで機能しますが、ここでは機能しません…

最も参考になるコメント

後でこれに遭遇した人にとって、Ember 2.xのヘルパーは「実際の」オブジェクトになり、サービスにアクセスできるようになりました( Ember.inject.serviceまたは初期化子ベースのインジェクションを介して)。

例:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});

全てのコメント6件

ヘルパーに注入することはできません。 ドキュメントが更新されたと思いますが、ドキュメントを修正できるように、これが可能であると記載されていることに気付いた場所を教えてください...

ああ、あなたはそれらを1.11用に更新しました。 ありがとう。 では、ヘルパー内、特にプレーンなEmber.Objectインスタンス(コンテナープロパティを持たない)からコンテナーにアクセスする必要がある場合は、どのような方向に進む必要がありますか?

@atomkirkヘルパーに何かを注入しようとする代わりに、コントローラー/コンポーネントに注入し、注入されたオブジェクトをヘルパーに渡す必要があります(または単に計算されたプロパティを使用します)。 または、ヘルパーの代わりにコンポーネントを使用します。

コンポーネント内でヘルパーを使用していて、通常はルートとコントローラーに挿入するユーザーデータにもアクセスする必要がある場合はどうなりますか? そのヘルパー内ではアクセスできません。
すべてのコンポーネントに渡すのは効率的ではないようです。たとえば、すべてのコンポーネントに対してuser.nameを作成する必要がありますが、すべてのコンポーネントに対して同じです。 したがって、50個のコンポーネントがある場合、コンポーネント内のヘルパーからアクセスするには、同じ値を50個のコンポーネントに渡す必要があります...
これを解決する方法はありますか?

これは、Ember.js1.13でクロージャーアクションで対処されています。 見てください:

後でこれに遭遇した人にとって、Ember 2.xのヘルパーは「実際の」オブジェクトになり、サービスにアクセスできるようになりました( Ember.inject.serviceまたは初期化子ベースのインジェクションを介して)。

例:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});
このページは役に立ちましたか?
0 / 5 - 0 評価