ArcGIS API – FeatureLayer Creation in JavaScript

arcgis-javascript-apifeature-layerjavascript

I got the sample called "Feature Layer with ONDEMAND mode" in the ArcGIS for js resource center. This example just adds layer with rivers to the map.

I want to use my own features instead of using features from the featureService like in this example. In order to do this I need to use another constructor of FeatureLayer so I modified the code like this:

  function initOperationalLayer(map) {

    var featureCollection = {
        layerDefinition: {
          "geometryType": "esriGeometryPoint",
          "fields": [
          {
            "name": "OBJECTID",
            "type": "esriFieldTypeOID"
          },
          {
            "name": "text",
            "type": "esriFieldTypeString"
          },
          {
            "name": "address",
            "type": "esriFieldTypeString"
          },
          {
            "name": "Shape",
            "type": "esriFieldTypeGeometry"
          }
          ]
        },
        featureSet: 
        [
        {   OBJECTID : 1, 
            text : 'a', 
            address : 'b', 
            Shape :  new esri.geometry.Point(-80.12468662, 40.42756484, map.spatialReference)
        }
        ]
    };
    var featureLayer = new esri.layers.FeatureLayer(featureCollection, {
        mode: esri.layers.FeatureLayer.MODE_ONDEMAND
    });

    map.addLayer(featureLayer);
    map.infoWindow.resize(150,105);
    mapLayers.push(featureLayer);  //this client side map layer is the maps graphics layer
  }

Unfortunately, it doesn't work. I got errors like "TypeError: _19c is undefined in utils.xd.js(line 14)". It is obfuscated code so i can't understand what't the problem.
Any ideas?


The right code is the following one:

    var jsonFS = {
        "displayFieldName": "Name",
        "fieldAliases": {
            "Name": "Name"
        },
        "geometryType": "esriGeometryPoint",
        "spatialReference": {
            "wkid": 4326
        },
        "fields": [{
            "name": "Name",
            "type": "esriFieldTypeString",
            "alias": "Name",
            "length": 255
        }],
        "features": [{
            "attributes": {
                "Name": "CHINA: YUNNAN PROVINCE; VIETNAM: HANOI"
            },
            "geometry": {
                "x": -10602460.248958504,
                "y": 4716882.997019428
            }
        }]
    };
    var fs = new esri.tasks.FeatureSet(jsonFS);

    var featureCollection = {
        layerDefinition: {
          "geometryType": "esriGeometryPoint",
          "fields": [
          {
            "name": "Name",
            "type": "esriFieldTypeString",
            "alias": "Name"
          }
          ]
        },
        featureSet: fs
    };

var featureLayer = new esri.layers.FeatureLayer(featureCollection, {
        mode: esri.layers.FeatureLayer.MODE_ONDEMAND
    });

Best Answer

'featureCollection' expects a 'features' attribute which is a FeatureSet, and not a featureSet attribute like you are doing:

var featureCollection = {
    layerDefinition: {
      "geometryType": "esriGeometryPolyline",
      "fields": [
          {
            "name": "OBJECTID",
            "type": "esriFieldTypeOID"
          },
          {
            "name": "text",
            "type": "esriFieldTypeString"
          },
          {
            "name": "address",
            "type": "esriFieldTypeString"
          }
      ]
    },
    features: 
    [
        {
            "attributes": {
                OBJECTID : 1, 
                text : 'a', 
                address : 'b', 
            },
            "geometry": { "x": -80.12468662, "y": 40.42756484 }
        }
    ]
};

For future debugging, I suggest copying the ESRI obfuscated code, and making it more readable by using JS Beautifier. Then just search for the error (in my case error was with variable _190). That should help you out with figuring out where and why the error occurs.