如何为服务以外的东西创建注入助手?

Tor*_*ups 4 ember.js

https://github.com/emberjs/ember.js/blob/5fd2d035b30aa9ebfe73de824b3b283ec8e589cc/packages/ember-runtime/lib/system/service.js#L31

在我上面的参考文献中,ember-core团队导入了这个createInjectionHelper并使用它来添加一个干净/简单的api来注入像这样的服务

App.ApplicationRoute = Ember.Route.extend({
  authManager: Ember.inject.service('auth'),
  model: function() {
    return this.get('authManager').findCurrentUser();
  }
});
Run Code Online (Sandbox Code Playgroud)

如何为非服务创建这样的东西?

wil*_*dev 6

您的示例用法将与上面的内容略有不同.我们将介绍一下injectRepositories的功能.

import injectRepositories from 'app/utils/inject';

export default Ember.Route.extend({
    repository: injectRepositories('person'),
    model: function() {
    var repository = this.get('repository');
        return repository.find();
    }
});
Run Code Online (Sandbox Code Playgroud)

可以通过以下更改来改进初始化程序:

import registerWithContainer from "ember-cli-auto-register/register";

export function initialize(_, application) {
    registerWithContainer("repositories", application);
    application.inject("repositories", "store", "store:main");
}

export default {
    name: "repositories",
    after: "store",
    initialize: initialize
};
Run Code Online (Sandbox Code Playgroud)

让我们分解每一行中发生的事情.

registerWithContainer("repositories", application);
Run Code Online (Sandbox Code Playgroud)

在上面的行中,我们将推迟到ember-addon ember-cli-auto-register.在这种情况下,此插件将获取repositories目录并将每个对象注册到Ember容器中,以便能够通过查找进行访问.它们将被插入,就像执行以下操作一样:

application.register("repositories:person", PersonRepository);
Run Code Online (Sandbox Code Playgroud)

然后我们添加一个函数来使用ember-addon ember-cli-injection进行注入:

// app/utils/inject.js
import inject from "ember-cli-injection/inject";

var injectRepositories = inject("repositories");

export default injectRepositories;
Run Code Online (Sandbox Code Playgroud)

这使我们有机会使用上面新创建的函数来访问这些对象,使用以下代码:

import injectRepositories from 'app/utils/inject';

export default Ember.Route.extend({
    repository: injectRepositories('person'),
    model: function() {
    var repository = this.get('repository');
        return repository.find();
    }
});
Run Code Online (Sandbox Code Playgroud)

由于每个对象现在都在容器中,我们可以在运行时查找并注入,而不是在应用程序初始化期间注入.我们repositories在函数中注册了密钥,然后返回一个计算属性(参见下面的ember-cli-injection代码).我们这样做是一个允许延迟加载的计算属性.在访问属性之前,不会从容器中获取对象.

import Ember from 'ember';

var injection = function(key) {
    return function(name) {
        return Ember.computed(function(propertyName) {
            var objectName = name || propertyName;
            return this.container.lookup(key + ':' + objectName);
        });
    };
};

export default injection;
Run Code Online (Sandbox Code Playgroud)

例如,我们还允许将名称传递给存储库功能repository: injectRepositories('person').这允许您在注入对象时命名对象.

如果您只想将对象命名为与注入容器的存储库名称相同,您也可以这样做person: injectRepositories().这会将person键传递给计算属性propertyName,因为null在注入时objectName会留下名称,而意思是person.这符合API产生类似的结果,但不一样的是,的Ember.inject.serviceEmber.inject.controller可用的灰烬1.10的API.