为什么我的定义调用没有触发?

时间:2013-04-10 14:09:46

标签: javascript jquery requirejs amd requirejs-define

我正在使用requireJS并尝试定义Google地图模块。

我将此代码添加到HTML代码段的末尾:

$(document).ready(function() {
  console.log("ready");
  define(['async!http://maps.google.com/maps/api/js?v=3&sensor=false'],
   function (gmap) {
     console.log(gmap);
   });
});

“就绪”控制台正在记录,但define呼叫未触发。如果我用require调用替换它,则正在加载文件,但我的gmap未定义。

问题:
为什么我的define电话没有触发?

1 个答案:

答案 0 :(得分:1)

这是因为一旦定义了模块,就需要它。将代码更改为这样的代码可以起作用:

// gmap.js (for example)
define(['async!http://maps.google.com/maps/api/js?v=3&sensor=false'], function(gmap) {
    // Do some stuff

    return gmap;
});

// main.js
require(['jquery', 'path/to/gmap'], function($, gmap) {
    $(function() {
        console.log(gmap);
    });
});

有些注意事项:

  • 定义的模块应该存在于单个文件中。阅读this page in the API documentation以了解它们的工作原理。
  • 避免在DOM就绪回调中要求模块,这意味着您必须等待更长时间才能请求模块。最好立即开始请求它们并在以后检查DOM准备情况。 RequireJS仅为此a DOM ready plugin附带。
  • 确保将require jQuery作为模块(除非您没有使用它)。
  • 将匿名函数传递给$()$(document).ready()
  • 的快捷方式