繁体   English   中英

注入到组件中并在计算属性中使用后,Ember服务未定义

[英]Ember service is undefined after being injected into a component and used in a computed property

我提供了一个相对简单的Ember服务,并试图通过Ember Docs本教程将其注入到组件中。 但是,在注入服务并通过计算属性调用其功能之一之后,出现了错误:

TypeError: undefined is not an object (evaluating 'this.get('businessValidator').validate')

我尝试使用调试器注销this.get('businessValidator')并返回未定义,就像使用console.log一样。 我尝试过按名称(如下所示)和隐式(无名称)初始化组件,因为它应该按照Ember docs和此处未标记的解决方案工作。 传递给组件的模型是businessValidation服务需要验证的业务。 我已经对服务本身进行了大量的单元测试。

/components/production-checker.js:

import Ember from 'ember';

export default Ember.Component.extend({
  businessValidator: Ember.inject.service('business-validator'),
  doesBusinessValidate: Ember.computed('model', function() {
     if (this.get('businessValidator').validate(this.get('model'))) {
      return "Ready for business!";
     } else {
       return "Production is halted!";
     }
  })
});

服务/业务validator.js:

import Ember from 'ember';

export default Ember.Service.extend({
  init() {
    this._super(...arguments);
  },
  validate(business) {
    let validMarkets = this.validateTargetMarkets(business);
    let validChosenProduct = this.validateChosenProduct(business);
    let validSuppliers = this.validateRequiredSuppliers(business);
    let validPrice = this.validatePrice(business);
    let validWorkers = this.validateWorkers(business);
    let validLocations = this.validateLocations(business);
    if (validMarkets && validChosenProduct && validSuppliers && validPrice && validWorkers && validLocations) {
      return true;
    } else {
      return false;
    }
  },
  validateTargetMarkets(business) {
    if (business.get("targetMarkets") && business.get('targetMarkets').get('length') > 0) {
      return true;
    } else {
      return false;
    }
  },
  validateChosenProduct(business) {
    if (business.get("chosenProduct")) {
      return true;
    } else {
      return false;
    }
  },
  validateRequiredSuppliers(business) {
    let result = false;
    if (business.get("chosenProduct") && business.get("chosenProduct").get("requiredResources") && business.get("chosenProduct").get("requiredResources").length > 0) {
      result = business.get("chosenProduct").get("requiredResources").every(function(item) {
        if (item.get('chosenSupplier')) {
          return true;
        } else {
          return false;
        }
      });
    }

    if (result) {
      return true;
    } else {
      return false;
    }
  },
  validatePrice(business) {
    if (business.get('chosenProduct') && business.get('chosenProduct').get('price') && business.get('chosenProduct').get('price') > 0) {
      return true;
    } else {
      return false;
    }
  },
  validateWorkers(business) {
    if (business.get('workers') && business.get('workers').get('length') > 0) {
      return true;
    } else {
      return false;
    }
  },
  validateLocations(business) {
    if (business.get('locations') && business.get('locations').get('length') > 0) {
      return true;
    } else {
      return false;
    }
  }

});

灰烬版本:

Ember      : 2.5.1
Ember Data : 2.5.2
jQuery     : 2.2.3

谢谢你的帮助!

好吧,实际上您的代码应该可以工作。 签出这个小玩意儿

因此,您的问题与您发布的代码无关。

也许您不使用最新的余烬版本?

另外,如果您向我们展示您的代码或不正常的操作,我们可以告诉您更多信息,但是对于此问题,一切正常。

可能不是这里的问题,但是,在开发插件时,我花了一些时间。 即使在我的comp中使用this.get('service_name'),我的服务也始终是未定义的。 这是访问它们的方式,因为属性是延迟加载的( https://guides.emberjs.com/v2.5.0/applications/services/ )。

我发现该服务也必须存在于app文件夹中,不仅存在于addon / service文件夹中,然后指向addons服务。

使用ember generate service service_name创建所有需要的文件...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM