注入组件并在计算属性

时间:2016-05-13 03:20:00

标签: javascript ember.js

我已经做了一个相对简单的Ember服务,并试图通过Ember Docsthis tutorial将其注入组件。但是,在注入服务并通过计算属性调用其中一个函数后,我收到错误:

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

我尝试使用调试器注销this.get(' businessValidator')并返回undefined,就像使用console.log一样。我已经尝试按名称(如下所示)和隐式地(没有名称,因为它应该按照Ember文档和unmarked solution here工作)来初始化组件。传递给组件的模型是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版本:

Ember      : 2.5.1
Ember Data : 2.5.2
jQuery     : 2.2.3

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

嗯,实际上你的代码应该可行。结帐this twiddle

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

也许你没有使用最新的余烬版本?

此外,如果您向我们展示您的代码或不工作的旋转,我们可以告诉您更多,但对于这个问题,一切都正常。

答案 1 :(得分:0)

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

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

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