javascript-Ember:从实用程序类访问余烬数据“存储”对象
作者:互联网
我在我的ember应用程序中有一个用于验证用户名的实用程序类,并按照ember-cli文档中的指定进行设置.我在应用程序中的多个位置(组件和控制器)进行客户端用户名验证,因此我想将验证逻辑引入可重用的方法中.
该文件位于/app/utils/username-validator.js中,我可以通过将其导入来成功将其包含在我的应用程序中,如下所示:从“ my-app / utils / username-validator”导入usernameValidator;
到目前为止,它的效果很好,我已经将该模式用于多个实用程序类.我现在遇到的问题是,我希望用户名验证器方法包括检查用户名是否已经存在的检查.
当我使用Ember-Data时,我想检查Ember-Data存储.默认情况下,似乎只能在控制器和路由中访问该存储.如何在实用程序类中使其可访问?我看到的所有注入示例都涉及将商店注入到其他一流的Ember对象(如组件)中.
是否可以将商店也注入简单的实用程序类?
谢谢!
我正在使用以下版本:
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/\u0026lt;service-name\u0026gt;.js内创建服务
服务蓝图将如下所示(请注意,服务的名称取决于文件的名称):
import Ember from "ember";
export default Ember.Service.extend({
myFunction: function(){
}
});
>在/app/initializers/\u0026lt;service-name\u0026gt;.js中为您的服务创建一个初始化程序,该初始化程序用于将您的服务注入到不同的顶级Ember对象(例如路由,控制器,组件等)中.请注意,初始化程序的文件名应与您的服务的文件名匹配.
初始化程序的蓝图如下所示:
export function initialize (container, app) {
// Your code here
}
export default {
name: '<service-name>',
initialize: initialize
};
举一个具体的例子,可以说您的服务称为验证程序,其中包含一堆验证例程.您希望将验证器注入所有控制器,还希望将Ember Data存储注入到验证器本身.您可以这样做:
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(...);
}
});
标签:ember-js,ember-cli,ember-data,javascript 来源: https://codeday.me/bug/20191120/2042327.html