Javascript 余烬:访问余烬数据';商店';来自实用程序类的对象
我有一个用于验证ember应用程序中用户名的实用程序类,并按照ember cli文档中的指定进行了设置。我在应用程序中的几个地方(组件和控制器)进行客户端用户名验证,所以我想将验证逻辑拉到一个可重用的方法中 文件位于Javascript 余烬:访问余烬数据';商店';来自实用程序类的对象,javascript,ember.js,ember-data,ember-cli,Javascript,Ember.js,Ember Data,Ember Cli,我有一个用于验证ember应用程序中用户名的实用程序类,并按照ember cli文档中的指定进行了设置。我在应用程序中的几个地方(组件和控制器)进行客户端用户名验证,所以我想将验证逻辑拉到一个可重用的方法中 文件位于/app/utils/username validator.js,我可以像这样导入该文件,从而成功地将其包含在我的应用程序中:从“我的应用程序/utils/username validator”导入usernamevidator 到目前为止,这非常有效,我已经将该模式用于几个实用程序
/app/utils/username validator.js
,我可以像这样导入该文件,从而成功地将其包含在我的应用程序中:从“我的应用程序/utils/username validator”导入usernamevidator代码>
到目前为止,这非常有效,我已经将该模式用于几个实用程序类。我现在遇到的问题是,我希望username validator
方法包括检查用户名是否已经存在
由于我正在使用余烬数据,我想检查余烬数据存储
。默认情况下,存储似乎只能在控制器和路由中访问。如何在我的实用程序类中访问它?我看到的所有注入示例都涉及将存储注入到其他第一类余烬对象(如组件)中
也可以将存储注入一个简单的实用程序类吗
谢谢大家!
我正在使用以下版本:
Ember-cli v0.2.6
ember.debug.js:4888 DEBUG: -------------------------------
ember.debug.js:4888 DEBUG: Ember : 1.12.0
ember.debug.js:4888 DEBUG: Ember Data : 1.0.0-beta.18
ember.debug.js:4888 DEBUG: jQuery : 1.11.3
ember.debug.js:4888 DEBUG: Ember Simple Auth : 0.8.0-beta.2
ember.debug.js:4888 DEBUG: -------------------------------
====根据torazaburo的回答更新了详细的解决方案======
创建服务非常有效。下面是我如何使用ember cli(v0.2.6)和ember v1.12.0实现的
在/app/services/.js
服务蓝图如下所示(注意,服务的名称基于文件的名称):
在/app/initializers/.js
中为您的服务创建一个初始值设定项,用于将您的服务注入不同的顶级Ember对象(如路由、控制器、组件等)。请注意,初始值设定项的文件名应与服务的文件名匹配李>
初始值设定项的蓝图如下所示:
export function initialize (container, app) {
// Your code here
}
export default {
name: '<service-name>',
initialize: initialize
};
export function initialize (container, app) {
// Inject the Ember Data Store into our validator service
app.inject('service:validator', 'store', 'store:main');
// Inject the validator into all controllers and routes
app.inject('controller', 'validator', 'service:validator');
app.inject('route', 'validator', 'service:validator');
}
export default {
name: 'validator',
initialize: initialize
};
将您的实用程序变成一个“服务”,您可以将存储注入其中。实际上,听起来你的工具应该是一种服务,即使它不需要商店。例如,通过使其成为一个服务,在编写测试时将其删除就变得容易得多。对于服务,您不需要导入任何内容,也不需要在初始值设定项中进行任何全局注入,您可以简单地说
export default Ember.Component.extend({
myService: Ember.inject.service(), // inject services/my-service.js
foo: function() {
this.get('myService').api1(...);
}
});
谢谢甚至没有注意到服务是可用的。结果很好。在问题中添加了一些关于如何实现此功能的详细信息。很好,但我将跳过初始值设定项部分,而是使用serviceName:Ember.inject.service
将服务带到任何需要的地方。实际上,服务的优点之一是,您不需要在初始值设定项中进行全局注入,只需在需要的地方直接注入即可。这种方法还允许您在测试时存根它们,如果您在初始值设定项中执行全局注入,则无法执行此操作。我看到了Ember.inject.service
,这看起来也很不错。我假设我仍然需要初始值设定项将存储注入验证程序服务。是吗?是的,您必须将存储注入初始值设定项中的服务中。
export default Ember.Component.extend({
myService: Ember.inject.service(), // inject services/my-service.js
foo: function() {
this.get('myService').api1(...);
}
});