【问题标题】:Angular provider must return a value from $get factory methodAngular 提供者必须从 $get 工厂方法返回一个值
【发布时间】:2015-05-26 07:33:51
【问题描述】:

所以我的角度工厂有一个问题,我已经尝试解决了一段时间。我想我在 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;
})();

我收到错误“Provider 'proj4js' must return a value from $get factory method.” 老实说,我不知道我拥有的 factory.$get 函数是做什么的。那是我没有写的代码的一部分。 Proj4js 是一个将坐标从一个系统转换到另一个系统的库。 所以我们从服务器加载对象以在谷歌地图上显示它们,其中一些不使用纬度经度。所以这就是为什么我们需要用 proj4js 转换它们。如果该信息对任何人都有帮助。

但我知道工厂方法需要返回一个对象。但我不是已经这样做了吗? 也许是那个 factory.$get 函数是问题所在,正如我所说我不知道​​它的目的......但是删除它并没有帮助^^

另外,不要介意它被称为 coodinateTransformerService 而不是 coordinateTransformerFactory。我首先使用了一项服务,只是在我让它工作之前不想重命名它。

编辑:这可能会有所帮助。在抛出错误的 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;
}
})();

【问题讨论】:

  • 代码中的哪一点实际上会将该错误作为响应?看起来有些东西应该调用 get 方法但没有,或者应该有 get 方法但没有。
  • @Anthony 不确定您的问题是什么意思,但我同意您所说的其他内容。 Mikalai 在他的回答中一并删除了 $get 函数。
  • 您的问题表明您看到“Provider 'proj4js' must return a value from $get factory method”,但在您的示例代码中并不清楚该错误的上下文是什么。某些代码中的某些点会导致该错误。知道 1) 触发错误的代码是有用的(从您的实际代码中复制,或者如果您很确定问题出在另一端,一个简单的一两行代码示例应该可以工作但得到该响应),以及 2)另一端的哪些特定代码似乎在抛出错误而不是有效响应。

标签: javascript jquery angularjs 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]';
    };
};

【讨论】:

  • 您能提供错误的详细信息吗?我刚刚提供了服务的概念。这里也可能是语法错误或注入错误。
  • 我猜这是一个注入错误:[$injector:undef] 这里是我在帖子中写的错误消息。
  • 我认为原因在服务 proj4js、gmaps、objectsEpsgCode。请检查它们,它应该可以解决问题。
  • 我已将 gmaps 更改为 uiGmapgooglMaps,我认为应该改为。删除 objectEpsgCode 作为注入。还要检查我的编辑,因为更改后我仍然收到错误。它可能会帮助你。
  • 听起来你想知道服务、工厂、提供者等之间的区别。简短的回答是它们都是同一事物的版本。工厂是专业版的提供者,服务是专业版的工厂。每个都可以让你用更少的代码做同样的事情。您可以在simplygoodcode.com/2015/11/… 找到一个非常高级和详细的解释
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多