1

(レガシーから AMD に移行するために) アプリケーションの 1 つをゼロから書き直しているときに、理解できないエラーが発生しました。それは私を夢中にさせています。おそらく何かのスペルミスか、別の小さな間違いがありますが、何が原因かわかりません。どんな助けでも大歓迎です!

私はまだ開発モードにいるので、現時点では私のコードはそれほどきれいではありません。ここで実際の動作を確認できます: 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
4

1 に答える 1

3

あなたの問題は次のとおりです。map.on("load", getFeaturesToMapAndStorage(where));

getFeaturesToMapAndStorageundefined を返すを呼び出して、それを"load"ハンドラーとして渡します。あなたが使用しているものの縮小版がg、ハンドラーへの参照として使用されていると思います。

gは未定義なので、基本的にはundefined(loadEvent).


編集:あなたは次のようなことをするつもりだったと思います:

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

EDIT 2: わかりやすくするために、何が間違っていたのかを詳しく説明します。あなたが持っていたものと私が上で提案したものとの違いは、 (のイベントの後に呼び出すのではなく)をgetFeaturesToMapAndStorage含む行で呼び出していたことです。事前に定義されたパラメーターで関数を呼び出すには、イベント ハンドラーとして渡される関数 (上記の無名関数のように) から呼び出す必要があります。map.on("load", getFeaturesToMapAndStorage(where));maploadgetFeaturesToMapAndStoragefunction(){...}

または、スコープの設定方法により、パラメーターを持つ代わりにwhere内部を参照できます。getFeaturesToMapAndStoragewhereClause

于 2014-07-27T08:40:59.147 に答える