![](/img/trans.png)
[英]Reading a computed property injected by a service with handlebars in ember.js
[英]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.