2015-05-26 51 views
1

所以我有一个问题,我的角工厂,我一直试图解决一段时间了。我猜我在角度上的知识还不够。

我将在这里发布的大部分代码是来自我没有写入的解决方案的另一部分的重用代码。所以这可能是我无法弄清楚的原因。这也是我有史以来第一个制造的工厂。

(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'必须从$ get factory方法返回一个值。” 说实话我不知道工厂是什么。$ get函数我有。这是我没有写的代码的一部分。 Proj4js是一个将坐标从一个系统转换为另一个系统的库。 因此,我们从服务器中加载对象以在Google地图上显示它们,其中一些不使用纬度经度。所以我们需要用proj4js来改变它们。如果这个信息会帮助任何人。

但我知道一个工厂方法需要返回一个对象。但我是不是已经这样做了? 也许是这个工厂。$ 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; 
} 
})(); 
+0

代码中的哪个点实际上得到该错误作为响应?它看起来应该调用get方法,但不是或者应该有get方法,但不是。 – Anthony

+0

@安东尼不确定你的问题是什么意思,但我同意你说的其他事情。 Mikalai在他的回答中一并删除了$ get函数。 –

+0

你的问题表明你看到“Provider'proj4js'必须从$ get factory method返回一个值”,但是在你的示例代码中并不清楚该错误的上下文是什么。某些代码中有一点会导致该错误。了解1)哪些代码会触发错误(从实际代码中复制,或者如果您确信问题出在另一端,那么应该有一个简单的一行或两行代码应该可以工作但得到那个响应),以及2)另一端的特定代码似乎是抛出错误而不是有效的响应。 – Anthony

回答

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]'; 
    }; 
}; 
+0

仍然收到错误 –

+0

您能否提供错误的详细信息?我刚刚提供了服务的概念。这可能是语法错误或注入错误。 – Mikalai

+0

我想这是一个注入错误:[$ injector:undef],这里是我在帖子中写的错误信息。 –

相关问题