Angular提供程序必须从$get工厂方法中返回一个值

Angular provider must return a value from $get factory method

本文关键字:返回 一个 方法 工厂 程序 get Angular      更新时间:2023-09-26

所以我有一个问题与我的角工厂,我一直试图解决一段时间了。我想我在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]';
    };
};