16

我希望这个问题不会太宽泛,但是在这个特定的 require.js/ESRI 示例中发生了很多不熟悉的语法,我希望有人可以向我解释其中的一些内容。

首先,这段代码有效(也就是说,它做了我期望它做的事情):它创建了一个基本地图并添加了一个从地图服务中提取的 FeatureLayer。它是 ESRI Javascript API 页面中示例的精简版。这是代码:

    var map;
    var featureLayer;

    require(["esri/map", "dojo/domReady!", "esri/layers/FeatureLayer"], function (Map) {
        map = new Map("map", {
            basemap: "topo",
            center: [-100.195, 39.567], // long, lat
            zoom: 4
        });

        featureLayer = new esri.layers.FeatureLayer(
            "http://my-server-url.com/arcgis/rest/services/Projects/MapServer/0",
            {
                mode: esri.layers.FeatureLayer.MODE_ONDEMAND
            }
        );

        map.addLayer(featureLayer);

    });

现在针对特定问题:

  1. 这 require([...], function(args) { } 语法是做什么的?我什至不知道如何阅读。它是对 require.js 的函数调用吗?方括号中的内容是什么?什么是函数参数?

  2. 从其他示例来看,在 require.js 调用中,每个包含通常应该有一个函数参数。但是在这里,如果我为 FeatureLayer 添加一个参数,它就不起作用了。

  3. “dojo/domReady!” 在任何示例中,include 似乎都没有相应的参数。这与感叹号有关吗?感叹号是什么意思?

  4. 谁能指出我有用的 require.js 参考?requirejs.org 网站读起来更像是技术规范,而不是用户手册。ESRI 网站似乎假设您知道如何使用 require。

是的,我一直在用谷歌搜索——问题是谷歌不擅长搜索计算机语法问题,因为它去掉了标点符号,而且因为“需要 javascript 语法”之类的东西会导致蹩脚(过于宽泛)的搜索词。

4

2 回答 2

28
  1. require([...], function(args) { }语法是“加载这个模块列表,一旦它们全部加载,就调用这个函数,并将这些模块的返回值作为参数”。方括号中的内容是脚本文件路径(减去 .js)或使用require.config 路径部分映射的模块 ID 的数组。回调函数的参数对应于数组中的路径/模块,但并非所有模块都返回有用的值,正如您在下一个问题中注意到的那样......

  2. 为 FeatureLayer 添加参数不起作用,因为您不能跳过参数。但请注意,许多模块实际上并没有返回打算使用的值。你会在 jQuery 插件中看到很多,模块的加载只是向 jQuery 注册插件,但不会向调用者返回值。我不知道 ESRI,但从代码片段来看,加载 FeatureLayer 只是将 FeatureLayer 添加到 esri.layers 全局对象中。

  3. 感叹号语法是为插件保留的。通常,感叹号后面会有其他东西,表示插件将加载的资源,例如text!myTemplate.html,但在插件的情况下,domReady!插件的存在只是作为在调用回调函数之前等待 DOM 加载的一种方式,所以不需要遵循感叹号。

  4. 外部资源的推荐列表对于 StackOverflow 来说是题外话,但我发现这有助于了解基本概念:http ://aaronhardy.com/javascript/javascript-architecture-requirejs-dependency-management/

于 2013-08-29T14:39:37.340 回答
0

requirejs 文档的这一部分描述了感叹号在以下上下文中的含义domReadyhttp ://requirejs.org/docs/api.html#pageload

由于 DOM 就绪是一种常见的应用程序需求,理想情况下可以避免上述 API 中的嵌套函数。domReady 模块还实现了 Loader Plugin API,因此您可以使用 loader 插件语法(注意 domReady 依赖项中的 !)强制 require() 回调函数在执行之前等待 DOM 准备好。

于 2015-04-27T15:58:12.150 回答