Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 余烬:访问余烬数据';商店';来自实用程序类的对象_Javascript_Ember.js_Ember Data_Ember Cli - Fatal编程技术网

Javascript 余烬:访问余烬数据';商店';来自实用程序类的对象

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 到目前为止,这非常有效,我已经将该模式用于几个实用程序

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

文件位于
/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(...);
        }
    
    });