Угловой провайдер должен вернуть значение из метода $get factory
Так что у меня есть проблема с моей угловой фабрикой, которую я уже давно пытаюсь решить. Я полагаю, что моих знаний по угловому языку здесь недостаточно.
Большая часть кода, который я опубликую здесь, представляет собой повторно используемый код из другой части решения, которое я не написал. Так что это, вероятно, причина, почему я не могу понять это. Также это первая фабрика, которую я сделал.
(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 factory". И, честно говоря, я не знаю, что выполняет фабрика. $ Get. Это часть кода, который я не написал. Proj4js - это библиотека, которая конвертирует координаты из одной системы в другую. Таким образом, мы загружаем объекты с сервера, чтобы отобразить их на карте Google, и некоторые из них не используют широту и долготу. Вот почему нам нужно преобразовать их с помощью proj4js. Если эта информация поможет кому-либо.
Но я знаю, что фабричный метод должен возвращать объект. Но разве я этого уже не делаю? Может быть, именно эта фабрика. $ Get функция в этом проблема, как я уже сказал, я не знаю ее цели... Но ее удаление не помогает ^^
Кроме того, не против того, что он называется coodinateTransformerService и не координирует TransformerFactory. Сначала я воспользовался сервисом, просто не хотел переименовывать его, пока не начал работать.
РЕДАКТИРОВАТЬ: Это может помочь. В 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;
}
})();
1 ответ
Как я вижу, вы перепутали сервис и провайдера. Самый простой способ удовлетворить ваши потребности будет:
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]';
};
};