我已经做了一个相对简单的Ember服务,并试图通过Ember Docs和this 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
感谢您的帮助!
答案 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
创建所有需要的文件......