簡體   English   中英

Ember:從實用程序類訪問ember數據“store”對象

[英]Ember: Access ember data 'store' object from utility class

我有一個實用程序類,用於驗證我的ember應用程序中的用戶名,並按照ember-cli文檔中的說明進行設置。 我在我的應用程序(組件和控制器)中的幾個位置進行客戶端用戶名驗證,因此我想將驗證邏輯拉出到可重用的方法中。

該文件位於/app/utils/username-validator.js ,我可以通過導入它成功地將文件包含在我的應用程序中: import usernameValidator from 'my-app/utils/username-validator';

到目前為止,這很有用,我已經將模式用於了幾個實用程序類。 我現在遇到的問題是我想使用username-validator方法來檢查用戶名是否已經存在。

當我使用Ember-Data時,我想查看Ember-Data store 默認情況下,商店似乎只能在控制器和路由中訪問。 如何在我的實用程序類中訪問它? 我見過的所有注入示例都涉及將存儲注入到其他第一類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的方法

  1. /app/services/<service-name>.js創建您的服務

服務藍圖將如下所示(注意服務的名稱基於文件的名稱):

import Ember from "ember";

export default Ember.Service.extend({
   myFunction: function(){

   }
});
  1. /app/initializers/<service-name>.js為您的服務創建初始化/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
};

將您的實用程序變為“服務”,您可以將其注入商店。 實際上,聽起來您的實用程序應該是一項服務,即使它不需要商店。 例如,通過將其作為服務,在編寫測試時將其刪除會變得更加容易。 使用服務,您既不需要導入任何內容也不需要在初始化程序中進行任何全局注入,您可以簡單地說

export default Ember.Component.extend({

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

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

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM