我有一个基本控制器,我注入了一个名为Uom的服务。我按照以下方式从我的控制器调用该服务:
Uom.get_measurement_unit_conversions().then( function( measurement_unit_conversions ) {
// Do some stuff here
});
我的服务看起来像......
angular.module('uomService', [])
.factory('Uom', function( $http ) {
return {
/**
* Will make a call to the restful API to get the
* measurement unit conversions and then return the formatted data.
*
* @return {float} Converted value
*/
get_measurement_unit_conversions: function()
{
var conversions = {};
$http({ method: 'GET', url: '/api/measurement_unit_conversions' })
.then( function( response ) {
angular.forEach( response.data.measurement_unit_conversions, function( object, key ) {
if( conversions.hasOwnProperty( object.source_measurement_unit_id ) == false )
{
conversions[object.source_measurement_unit_id] = {};
}
conversions[object.source_measurement_unit_id][object.target_measurement_unit_id] = object.formula;
});
return conversions;
});
}
}
});
但我一直收到错误
Uom.get_measurement_unit_conversions(...)。那么不是函数
我从另一个堆栈溢出问题中接受了我的方法
What is the best practice for making an AJAX call in Angular.js?
知道我做错了吗?
答案 0 :(得分:1)
这里有几个问题 - 首先,请注意您的get_measurement_unit_conversions
函数实际上并没有返回任何内容。 return语句位于then
块中,但服务函数本身返回undefined
。正如Charles所说,你必须从$http(...)
返回结果。
另一个问题是,为了承诺链接'要工作,您需要从then
函数返回一个承诺。
以下是应该工作的服务的修改版本(要小心,未经测试)。请注意,我注入了$ q服务,以便使用$q.when()
,它在新的承诺中包含任意值:
angular.module('uomService', [])
.factory('Uom', function( $http, $q ) {
return {
/**
* Will make a call to the restful API to get the
* measurement unit conversions and then return the formatted data.
*
* @return {float} Converted value
*/
get_measurement_unit_conversions: function()
{
return $http({ method: 'GET', url: '/api/measurement_unit_conversions' })
.then( function( response ) {
var conversions = {};
angular.forEach( response.data.measurement_unit_conversions, function( object, key ) {
if( conversions.hasOwnProperty( object.source_measurement_unit_id ) == false )
{
conversions[object.source_measurement_unit_id] = {};
}
conversions[object.source_measurement_unit_id][object.target_measurement_unit_id] = object.formula;
});
return $q.when(conversions);
});
}
}
});
答案 1 :(得分:0)
你必须返回$ http调用,因为这会返回一个promise。
return $http(...)