javascript - 类型错误 : g is not a function

标签 javascript arcgis-js-api

当我从头开始重写我的一个应用程序(从遗留到 AMD)时,我遇到了一个我无法弄清楚的错误。这让我发疯。我可能只是拼写错误或有另一个小错误,但我无法弄清楚是什么。任何帮助将不胜感激!

我仍处于开发模式,所以我的代码目前还不够漂亮。您可以在这里看到它的实际运行情况:http://tpgrf.nl/testserver/alpha/topotrainer/flevoland

JavaScript 代码:

//Define area and url's  
var currentPath = window.location.pathname.split('/');
var AREA = currentPath[currentPath.length - 2];
if (AREA == 'europa' || AREA == 'wereld' || AREA == 'nederland') {
    var AREAURL = AREA;
    var AREAisProvince = false;
} else {
    AREAURL = 'nederland';
    var AREAisProvince = true;
}; //Ondervang provincies  


var basemapURL = window.location.protocol + "//tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/Topografie_in_de_klas_" + AREAURL + "_ondergrond/MapServer";
var contentFeatureURL = window.location.protocol + "//services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_" + AREAURL + "/FeatureServer/0";




var CONTENT = 'cito100'; //Default to 'cito100', user can adjust manually  
var TYPES = ''; //empty for now, will be defined later by the user  
var TYPES = 'plaats'; //for testingunction's//  
//  
function generateUUID() {
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = (d + Math.random() * 16) % 16 | 0;
        d = Math.floor(d / 16);
        return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
    });
    return uuid;
};


//  
//Figure something out here to detect if the user as a new or returning visitor  
//  


//////////////////////////////////////  
//Create a basemap and load features//  
//////////////////////////////////////  
var dojoConfig = { parseOnLoad: true };


var map;
require(["esri/geometry/Extent", "esri/SpatialReference", "esri/map", "esri/graphic", "esri/layers/ArcGISTiledMapServiceLayer", "esri/tasks/query", "esri/tasks/QueryTask", "esri/tasks/FeatureSet", "esri/layers/GraphicsLayer", "esri/Color", "esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol", "esri/symbols/PictureMarkerSymbol", "esri/renderers/UniqueValueRenderer", "esri/renderers/ClassBreaksRenderer",
    "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dijit/TitlePane",
    "dojo/domReady!", "dojo/dom", "dojo/on"],
    function (Extent, SpatialReference, Map, Graphic, Tiled, Query, QueryTask, FeatureSet, GraphicsLayer, Color, SimpleMarkerSymbol, SimpleLineSymbol, PictureMarkerSymbol, UniqueValueRenderer, ClassBreaksRenderer, dom, on) {
        //@TODO: Can we actually define this on the basemap mapserver?  
        if (AREA == 'nederland' || AREAisProvince == true) {
            var initExtent = new Extent(-165715, 6453119, 1435181, 7205260, new SpatialReference({ wkid: 102100 }));
        }
        if (AREA == 'europa') {
            var initExtent = new Extent(-2827847, 2851709, 6838658, 11375669, new SpatialReference({ wkid: 102100 }));
        }
        if (AREA == 'wereld') {
            var initExtent = new Extent(-19705424, -14849545, 21700207, 21624981, new SpatialReference({ wkid: 102100 }));
        }

        map = new Map("map", {
            extent: initExtent
        });


        //let's add a basemap  
        var tiled = new Tiled(basemapURL);
        map.addLayer(tiled);

        where = 'Cito100_onderdeel=1';
        if (AREAisProvince == true) {
            where += ' AND Provincie=\'' + AREA + '\'';
        }
        map.on("load", getFeaturesToMapAndStorage(where));

        function getFeaturesToMapAndStorage(whereClause) {
            console.log(whereClause);
            //query the featureService  
            var query = new Query();
            query.returnGeometry = true;
            query.outFields = ["*"];
            query.outSpatialReference = new SpatialReference({ wkid: 102100 });
            query.where = whereClause;

            var queryTask = new QueryTask(contentFeatureURL);

            queryTask.on("complete", function (event) {
                //map.graphics.clear();  
                var featureGraphicsLayer = new GraphicsLayer();


                //@TODO: Can't we find a way to use the symbols from the featurservice directly, instead of the url's?  
                defaultSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE, 10,
            new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
            new Color([255, 0, 0]), 1),
            new Color([0, 255, 0, 0.25]));

                var renderer = new UniqueValueRenderer(defaultSymbol, "Type");
                renderer.addValue("Plaats", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_nederland/FeatureServer/0/images/89e5f81878a69f9cc0525c841f98af54", 11, 11));
                renderer.addValue("Gebied", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_nederland/FeatureServer/0/images/165c76bd4465728a34f6d18df4a1ec03", 28, 28));
                renderer.addValue("Water", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_nederland/FeatureServer/0/images/f9c146a401f48c4f38202e83c2e4582a", 22, 22));
                renderer.addValue("Provincie", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_nederland/FeatureServer/0/images/7a5373d8f1dcd1ecc03cefbab687b97c", 38, 32));
                renderer.addValue("Land", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_europa/FeatureServer/0/images/7a5373d8f1dcd1ecc03cefbab687b97c", 38, 32));
                renderer.addValue("Werelddeel", new PictureMarkerSymbol("https://services.arcgis.com/nSZVuSZjHpEZZbRo/ArcGIS/rest/services/Topografie_in_de_klas_wereld/FeatureServer/0/images/48f2256a49253388488d813d721c054b", 32, 38));

                var features = event.featureSet.features;
                var featureCount = features.length;
                for (var i = 0; i < featureCount; i++) {
                    var graphic = features[i];
                    featureGraphicsLayer.add(graphic);
                }
                featureGraphicsLayer.renderer = renderer;
                map.addLayer(featureGraphicsLayer);

                //@TODO: Update localstorage    

            }); //end on queryTask complete  

            queryTask.execute(query, queryComplete);

            function queryComplete() {
                console.log("fire function queryComplete");
                //@TODO: reset progressbar  
            }; //End function queryComplete  


        } //end function getFeaturesToMapAndStorage  

        //The two closing tags below are essential and close the complete DOJO part.    
    } //end function after require (AMD style)  
    ); //end require

最佳答案

您的问题在于:map.on("load", getFeaturesToMapAndStorage(where));

您正在调用返回未定义的 getFeaturesToMapAndStorage,并将其作为 “load” 处理程序传递。我猜你正在使用的任何东西的缩小版本都使用 g 作为对你的处理程序的引用。

因为 g 是未定义的,你基本上是说 undefined(loadEvent)


编辑:我猜你打算做这样的事情:

map.on("load", function(){
    getFeaturesToMapAndStorage(where);
});

编辑 2:为清楚起见,我将更详细地解释错误所在。 你所拥有的和我上面建议的之间的区别在于,你在包含 map.on("load", getFeaturesToMapAndStorage(where)); 的行上调用了 getFeaturesToMapAndStorage (与在 mapload 事件之后调用它相反)。为了使用预定参数调用您的函数 getFeaturesToMapAndStorage,您需要从一个函数调用它(如上面的匿名函数 - function(){...})然后将作为事件处理程序传入。

或者,由于您确定范围的方式,您可以在 getFeaturesToMapAndStorage 中引用您的 where 来代替 whereClause 参数。

关于javascript - 类型错误 : g is not a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24979256/

相关文章:

javascript - 使用 MySQL 中的数据自动完成 <ol> 和 <li>

javascript - 如何获取 arcgis IdentyfyTask addCallback 的值?

javascript - 将 R data.frame 转换为 Javascript 数组

javascript - 连接 JSON 中的字符串

javascript - ArcGIS Javascript API - addLayers

html - 如何划分我的 html 页面以显示带有 float 侧面板的 map 和标题栏

javascript - CSS 转换不适用于 UL 列表上的最大高度切换

javascript - 跨源请求被阻止 : Occur even after CORS enabled on my API ;

javascript - D3.js 强制有向图,通过使边相互排斥来减少边交叉

javascript - 如何使用 javascript 调试换行问题