gpt4 book ai didi

javascript - Ember : Access ember data 'store' object from utility class

转载 作者:行者123 更新时间:2023-11-29 10:40:16 25 4
gpt4 key购买 nike

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

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

目前为止效果很好,我已经将此模式用于多个实用程序类。我现在遇到的问题是我想要 username-validator方法来检查用户名是否已经存在。

因为我正在使用 Ember-Data,所以我想检查 Ember-Data store .默认情况下,商店似乎只能在 Controller 和路由中访问。我怎样才能在我的实用程序类中访问它?我见过的所有注入(inject)示例都涉及将商店注入(inject)其他一流的 Ember 对象(如组件)。

是否也可以将商店注入(inject)到一个简单的实用程序类中?

谢谢!

我正在使用以下版本:

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 中的服务创建一个初始化程序它用于将您的服务注入(inject)不同的顶级 Ember 对象(例如路由、 Controller 、组件等)。请注意,初始化程序的文件名应与您的服务的文件名匹配。

初始化程序的蓝图如下所示:

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

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

举一个具体的例子,假设您的服务名为 validator并包含一堆验证例程。您想要将验证器注入(inject)所有 Controller ,并且还想将 Ember 数据存储注入(inject)验证器本身。你可以这样做:

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

最佳答案

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

export default Ember.Component.extend({

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

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

});

关于javascript - Ember : Access ember data 'store' object from utility class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com