2

我刚刚开始使用 RequireJS,看来我没有正确表达我的依赖关系。我正在尝试映射一个相当简单的依赖链:

KnockoutJS取决于jquery-tmpl取决于jquery

我试图不使用require-jquery. 在我的 HTML 中,我这样做:

<script data-main="scripts/main" src="scripts/require.js"></script>

我的main.js

require(
  {
    baseUrl: 'scripts',
    paths: {
        jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
        jquerytmpl: "require-jquery-tmpl",
        knockout: "require-knockout"
    }
  },
  ["myApp"],
  function() {
        $(function() {
            console.log('main: triggered');
        });
  }
);

我的require-jquery-tmpl.js

define([
  "order!jquery",
  "order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"], 
  function() {
    console.log("init tmpl");
  }
);

我的require-knockout.js

define([
  "order!jquerytmpl",
  "order!./scripts/knockout-1.2.1.js"], 
  function() {
        console.log("init ko");
  }
);

最后,myApp.js

define(["knockout"], function() {
    $(function() { ... }
}

我看到的是,knockout-1.2.1.js 在 jquery-tmpl.js 之前被加载和评估。console.logs 显示init tmpl发生在 之前,init ko因此 RequireJS 回调以正确的顺序触发。但是,我在 Knockout 中添加了一些调试日志,我可以看到它在init tmpl发生之前得到了评估。

结果,当我尝试时ko.applyBindings(),它抱怨找不到 jQuery 模板。有趣的是,如果我手动告诉 KO 在回调中注册默认模板引擎,它工作正常,一切都很完美。但是,我认为这只是掩盖了核心问题。

为什么 RequireJS 在评估 Knockout 之前不等到 jquery-tmpl 被加载?

4

2 回答 2

3

我无法诊断出实际问题,但我通过使用require而不是define在模块定义的部分中使我的依赖项工作。适合我的配置如下所示:

我的main.js

require(
  {
    baseUrl: 'scripts',
    paths: {
        jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min',
        jquerytmpl: "require-jquery-tmpl",
        knockout: "require-knockout"
    }
  },
  ["myApp"],
  function() {
        $(function() {
            console.log('main: triggered');
        });
  }
);

我的require-jquery-tmpl.js

define(["jquery"], function() {
    require(["order!http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"], function() {
        console.log("init tmpl");
    });
});

请注意,我说的是requirejquery.tmpl.js,order而不是在define依赖项中列出它。

相同的更改require-knockout.js

define(["jquerytmpl"], function() {
    require(["order!knockout-1.2.1.js"], function() {
        console.log("init ko");
    });
});

解决了我的问题,但我仍然没有解释为什么RequreJs order插件无法与我的原始定义正常工作。

于 2011-10-29T07:02:48.860 回答
0

您的目录中有order.js文件scripts吗?

此外,当您还想包含 jquery 时,requirejs 站点建议使用 require-jquery.js 而不是 require.js。我一直使用它没有问题。

于 2011-10-27T17:55:04.367 回答