如何以及何时使用 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,则在您的应用程序中的每个 route
和 controller
中注入一个 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');
...
);
换句话说,register
和 inject
是注册依赖并自己注入它们的方法。
假设您有一个 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')
。
虽然register
和inject
非常强大,但您应该明智地使用它们,并且只有在您确实知道没有其他方法可以实现您的目标的情况下,我想缺乏文档是一种沮丧的迹象。
更新 - 没有工作示例就没有很好的解释
由于提供一个带有解释的工作示例几乎是必须的,所以它是: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 注册和注入方法?的主要内容,如果未能解决你的问题,请参考以下文章