Angular提供程序必须从$get工厂方法中返回一个值
Angular provider must return a value from $get factory method
所以我有一个问题与我的角工厂,我一直试图解决一段时间了。我想我在angular方面的知识还不够。
我将在这里发布的大多数代码都是来自解决方案的另一部分的重用代码,而不是我编写的。这可能就是我解不出来的原因。这也是我第一次建工厂。
(function () {
'use strict';
angular.module('app.coordinate-transformer-service', [])
.factory('coordinateTransformerService', coordinateTransformerService);
coordinateTransformerService.$inject = ['proj4js', 'gmaps'];
function coordinateTransformerService(proj4js, gmaps, objectsEpsgCode) {
var factory = {};
factory.$get = ['proj4js', function coordinateTransformerFactory(proj4js) {
return new coordinateTransformerService(proj4js, gmaps, objectsEpsgCode);
}];
var mapProjection = 'EPSG:4326', // WGS84 latlong
objectsProjection = 'EPSG:' + objectsEpsgCode,
transformCoordinatesToLatLng = function (point) {
if (objectsProjection === mapProjection) {
return new gmaps.LatLng(point.y, point.x);
}
var newPoint = {
x: point.x,
y: point.y
};
proj4js.transform(new proj4js.Proj(objectsProjection), new proj4js.Proj(mapProjection), newPoint);
return new gmaps.LatLng(newPoint.y, newPoint.x);
};
factory.transformLatLngToProject = function (latlng) {
if (!factory.isFunction(latlng.lng) || !factory.isFunction(latlng.lat)) {
throw new Error("No functions lat() or lng() exists on parameter latlng");
}
var newPoint = {
x: latlng.lng(),
y: latlng.lat()
};
proj4js.transform(new proj4js.Proj(mapProjection), new proj4js.Proj(objectsProjection), newPoint);
newPoint = roundPointsToCorrectDecimals(newPoint);
return newPoint;
};
factory.roundPointsToCorrectDecimals = function (point) {
var noDecimals = objectsEpsgCode === 4326 ? 5 : 0;
if (!point || !point.x || !point.y) {
throw new Error("Point, x or y is null or not defined");
}
return {
x: point.x.toFixed(noDecimals),
y: point.y.toFixed(noDecimals)
};
};
factory.isFunction = function (functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
};
return factory;
};
//coordinateTransformerService.prototype = {
// constructor: coordinateTransformerService
//};
//return coordinateTransformerService;
})();
我得到错误"提供者'proj4js'必须从$get工厂方法返回一个值。"说实话,我不知道工厂。$get函数。这部分代码不是我写的。Proj4js是一个将坐标从一个系统转换为另一个系统的库。我们从服务器加载对象显示在谷歌地图上,其中一些不使用经纬度。这就是为什么我们需要用proj4js来转换它们。如果这些信息对任何人都有帮助。
但是我知道工厂方法需要返回一个对象。但我不是已经这么做了吗?也许是那家工厂。$get函数是问题所在,正如我说过的,我不知道它的目的…但是去掉它也没有用^^
另外,不要介意它叫coordinatetransformerservice而不是coordinateTransformerFactory。我先使用了一个服务,只是不介意重命名它,直到我让它工作。
EDIT:这可能有帮助。在angular.js中抛出错误:
function enforceReturnValue(name, factory) {
return function enforcedReturnValue() {
var result = instanceInjector.invoke(factory, this, undefined, name);
if (isUndefined(result)) {
throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name);
}
return result;
};
}
结果未定义。名字是proj4js,工厂是一个同事做的:
(function () {
'use strict';
angular.module('blocks.proj4js').factory('proj4js', proj4jsFactory);
proj4jsFactory.$inject = ['$window'];
function proj4jsFactory($window) {
return $window.proj4js;
}
})();
我看你把服务和提供者搞混了。满足你的需求最简单的方法是:
angular.module('app.coordinate-transformer-service', [])
.service('coordinateTransformerService', CoordinateTransformerService);
CoordinateTransformerService.$inject = ['proj4js', 'gmaps', 'objectsEpsgCode'];
function CoordinateTransformerService(proj4js, gmaps, objectsEpsgCode) {
var mapProjection = 'EPSG:4326', // WGS84 latlong
objectsProjection = 'EPSG:' + objectsEpsgCode,
transformCoordinatesToLatLng = function (point) {
if (objectsProjection === mapProjection) {
return new gmaps.LatLng(point.y, point.x);
}
var newPoint = {
x: point.x,
y: point.y
};
proj4js.transform(new proj4js.Proj(objectsProjection), new proj4js.Proj(mapProjection), newPoint);
return new gmaps.LatLng(newPoint.y, newPoint.x);
};
this.transformLatLngToProject = function (latlng) {
if (!this.isFunction(latlng.lng) || !this.isFunction(latlng.lat)) {
throw new Error("No functions lat() or lng() exists on parameter latlng");
}
var newPoint = {
x: latlng.lng(),
y: latlng.lat()
};
proj4js.transform(new proj4js.Proj(mapProjection), new proj4js.Proj(objectsProjection), newPoint);
newPoint = roundPointsToCorrectDecimals(newPoint);
return newPoint;
};
this.roundPointsToCorrectDecimals = function (point) {
var noDecimals = objectsEpsgCode === 4326 ? 5 : 0;
if (!point || !point.x || !point.y) {
throw new Error("Point, x or y is null or not defined");
}
return {
x: point.x.toFixed(noDecimals),
y: point.y.toFixed(noDecimals)
};
};
this.isFunction = function (functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
};
};
相关文章:
- 节点导出返回一个空对象
- Angular js-返回一个包含类似
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- Javascript:在激发函数后返回一个变量以供使用
- Protractor:element.getText()返回一个对象,而不是String
- JSTree's data.rslt.obj.text()返回一个文本数组,而不是所需节点的文本
- 我应该返回一个类似console.log()的方法调用吗
- 从 javascript 中的对象方法返回一个对象
- new SharedWorker(“whatever.js”)返回一个错误
- 从js中的对象返回一个值
- 乘法返回一个奇怪的结果
- 返回一个关联数组,而不是mongoose中的文档数组
- 为什么我的$http.post返回一个400错误
- 返回一个新函数,而不是工厂中的对象
- 从javascript函数返回一个对象
- 从 angularjs 中的嵌套成功函数返回一个值
- 将字符串转换为数组使用javascript更新一个值并返回一个字符串
- jQuery's$.post只返回一个空白数据