2015-05-26 32 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],這裏是我在帖子中寫的錯誤信息。 –

相關問題