如何以及何时使用 Ember.Application 注册和注入方法?

Posted

技术标签:

【中文标题】如何以及何时使用 Ember.Application 注册和注入方法?【英文标题】:How and when to use Ember.Application register and inject methods? 【发布时间】:2013-08-15 02:45:04 【问题描述】:

我正在尝试了解如何使用 Ember.Application register 和 inject 方法

这些函数的设计用途是什么? 它们如何使用以及何时使用?

我真的很想知道!

【问题讨论】:

【参考方案1】:

默认情况下,Ember 在引导您的应用程序时使用大多数约定进行依赖注入,例如,如果您使用 ember-data,则在您的应用程序中的每个 routecontroller 中注入一个 store 类的实例,因此,您以后只需在任何路由或控制器中执行 this.get('store') 即可获得参考。

例如,这里是一个代码提取,其中注册了默认的store(取自source)

Ember.onLoad('Ember.Application', function(Application) 
  Application.initializer(
    name: "store",

    initialize: function(container, application) 
      application.register('store:main', application.Store);
      ...
    

    container.lookup('store:main');
  
);

然后注入(source)

Application.initializer(
  name: "injectStore",

  initialize: function(container, application) 
    application.inject('controller', 'store', 'store:main');
    application.inject('route', 'store', 'store:main');
    application.inject('dataAdapter', 'store', 'store:main');
  
  ...
);

换句话说,registerinject 是注册依赖并自己注入它们的方法。

假设您有一个 Session 对象,您在应用程序启动时的服务器请求后填充该对象,并且您希望在每个控制器中都有一个引用,您可以执行以下操作:

var App = Ember.Application.create(
  ready: function()
    this.register('session:current', App.Session, singleton: true);
    this.inject('controller', 'session', 'session:current');
  
);

App.Session = Ember.Object.extend(
  sessionHash: ''
);

此代码会将每个控制器实例的 session 属性设置为 App.Session 的单例实例,因此您可以在任何控制器中执行 this.get('session') 并获取对它的引用,因为它被定义为单例将始终是相同的 session 对象。

使用register,您可以注册控制器、模型、视图或任何任意对象类型。另一方面,inject 可以注入给定类的所有实例。例如,inject('model', 'session', 'session:current') 还会将带有 session:current 实例的 session 属性注入所有模型。要注入 session 对象,假设您可以在 IndexView 上注入 inject('view:index', 'session', 'session:current')

虽然registerinject 非常强大,但您应该明智地使用它们,并且只有在您确实知道没有其他方法可以实现您的目标的情况下,我想缺乏文档是一种沮丧的迹象。

更新 - 没有工作示例就没有很好的解释

由于提供一个带有解释的工作示例几乎是必须的,所以它是:http://jsbin.com/usaluc/6/edit。请注意,在示例中,我们可以通过在我们所在的每个路由中使用controller.session.sessionHash 引用当前控制器的会话对象来简单地访问提到的sessionHash,这是我们通过注册和注入App.Session 所做的事情的优点应用程序中每个控制器中的对象。

希望对你有帮助。

【讨论】:

我正在为 Ember.js 构建一个交互式备忘单,你介意我把它放在那里吗?你可以在这里看到它:embersherpa.com 它可能会在 Em.Application.register 和 Em.Application.inject 下。你怎么看? @tarasm,备忘单的好主意 - 继续!如果你遇到Ember.Component,你也可以使用我刚刚写完的这个答案:***.com/questions/18482457/… 甜,我会的。谢谢!我想关注你,你的推特是什么? @tarasm,我的 twitter 与 SO intuitivepixel 上的昵称相同但是我在那里不是很活跃,但仍然可以改变:) @Martin :main:current 等就像标签一样。如果您有多个相同的对象,但您想要注册的实现稍有不同,则它们很有用,myObject:basic, MyObjectBasic ...myObject:advanced, MyObjectAdvanced ...。我希望它有意义?【参考方案2】:

一个常见的用例是将当前登录用户属性提供给控制器和路由,如 https://github.com/kelonye/ember-user/blob/master/lib/index.js 和 https://github.com/kelonye/ember-user/blob/master/test/index.js

【讨论】:

嗨迈克尔,我终于有机会再次查看所有内容。谢谢你的榜样,我给你的图书馆加了星标。

以上是关于如何以及何时使用 Ember.Application 注册和注入方法?的主要内容,如果未能解决你的问题,请参考以下文章

何时以及如何使用 Tornado?啥时候没用?

如何以及何时使用 Ember.Application 注册和注入方法?

我如何知道何时索引列以及使用啥索引?

何时以及如何使用 PySide QEventLoop

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

JSF 中的“绑定”属性如何工作?何时以及如何使用它?