【问题标题】:Ember: Access ember data 'store' object from utility classEmber:从实用程序类访问 ember 数据“存储”对象
【发布时间】:2015-06-02 03:15:24
【问题描述】:

我有一个实用程序类,用于在我的 ember 应用程序中验证用户名,并按照 ember-cli 文档中的说明进行设置。我在我的应用程序(组件和控制器)的几个地方进行客户端用户名验证,因此我想将验证逻辑提取到可重用的方法中。

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

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

在使用 Ember-Data 时,我想检查 Ember-Data 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(){

   }
});
  1. /app/initializers/<service-name>.js 中为您的服务创建一个初始化程序,用于将您的服务注入不同的顶级Ember 对象(例如路由、控制器、组件等)。请注意,初始化程序的文件名应与您的服务的文件名匹配。

初始化器的蓝图如下所示:

export function initialize (container, app) {
       // Your code here
}

export default {
  name: '<service-name>',
  initialize: initialize
};

举一个具体的例子,假设你的服务被称为validator 并且包含一堆验证例程。您希望将验证器注入所有控制器,并且您还希望将 Ember 数据存储注入验证器本身。你可以这样做:

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
};

【问题讨论】:

  • 很好,但我会跳过初始化程序部分,而只需使用serviceName: Ember.inject.service 将服务带到您需要的任何地方。实际上,服务的优点之一是您不需要在初始化程序中进行全局注入,并且可以在需要它们的任何地方直接注入它们。这种方法也允许您在测试时对它们进行存根,如果您在初始化程序中进行全局注入,则无法做到这一点。
  • 我看到了Ember.inject.service,它看起来也不错。我假设我仍然需要初始化程序将存储注入验证器服务。对吗?
  • 是的,您必须在初始化程序中将存储注入到服务中。

标签: javascript ember.js ember-data ember-cli


【解决方案1】:

将您的实用程序变成“服务”,您可以将商店注入其中。实际上,听起来您的实用程序无论如何都应该是一项服务,即使它不需要商店。例如,通过使其成为服务,在编写测试时将其存根变得更加容易。使用服务,您不需要导入任何东西,也不需要在初始化程序中进行任何全局注入,您可以简单地说

export default Ember.Component.extend({

    myService: Ember.inject.service(), // inject services/my-service.js

    foo: function() {
         this.get('myService').api1(...);
    }

});

【讨论】:

  • 谢谢!甚至注意到服务可用。这效果很好。在问题中添加了一些有关如何使其工作的详细信息。
猜你喜欢
  • 2015-04-10
  • 1970-01-01
  • 2022-09-28
  • 2018-03-08
  • 1970-01-01
  • 2014-02-28
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多