Ember:从实用程序类访问 ember 数据'store'对象



我有一个实用程序类,用于在我的ember应用程序中验证用户名,并按照ember-cli文档中指定的方式进行设置。我在应用程序的几个地方(组件和控制器)进行客户端用户名验证,所以我想把验证逻辑拉到一个可重用的方法中。

文件位于/app/utils/username-validator.js,我可以成功地将文件包含在我的应用程序中,通过导入它,如下所示:import usernameValidator from 'my-app/utils/username-validator';

到目前为止,这工作得很好,我已经在几个实用程序类中使用了该模式。我现在遇到的问题是,我希望username-validator方法包括检查,看看用户名是否已经存在。

当我使用Ember-Data时,我想检查Ember-Data store。默认情况下,store似乎只能在控制器和路由中访问。如何在我的实用程序类中访问它?我看到的所有注入示例都是将store注入到其他第一类Ember对象(如组件)中。

是否也可以将store注入到一个简单的实用程序类中?

谢谢!

我使用以下版本:

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

  1. /app/services/<service-name>.js内创建服务

服务蓝图看起来像这样(注意服务的名称是基于文件名的):

import Ember from "ember";
export default Ember.Service.extend({
   myFunction: function(){
   }
});
  • /app/initializers/<service-name>.js中为你的服务创建一个初始化器,用于将你的服务注入不同的顶级Ember对象(如路由,控制器,组件等)。注意,初始化器的文件名应该与服务的文件名匹配。
  • 初始化器的蓝图应该是这样的:

    export function initialize (container, app) {
           // Your code here
    }
    export default {
      name: '<service-name>',
      initialize: initialize
    };
    

    举一个具体的例子,假设你的服务名为validator,包含一堆验证例程。您希望将验证器注入到所有控制器中,并且还希望将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
    };
    

    让你的实用程序变成一个"service",你可以在其中注入store。实际上,听起来你的实用程序应该是一个服务,即使它不需要存储。例如,通过使其成为服务,在编写测试时将其存根变得容易得多。对于服务,您既不需要导入任何东西,也不需要在初始化器中进行任何全局注入,您只需输入

    export default Ember.Component.extend({
        myService: Ember.inject.service(), // inject services/my-service.js
        foo: function() {
             this.get('myService').api1(...);
        }
    });
    

    最新更新