我的RequireJS依赖链有什么问题?

时间:2011-10-27 07:23:08

标签: jquery knockout.js jquery-templates requirejs

我刚开始使用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() { ... }
}

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

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

为什么RequireJS在评估Knockout之前没有加载jquery-tmpl?

2 个答案:

答案 0 :(得分: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");
    });
});

注意我说的是require jquery.tmpl.js和order,而不是将它列在define依赖项中。

require-knockout.js的相同更改:

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

修复了我的问题,但我仍然没有解释为什么RequreJs order插件无法正常使用原始定义。

答案 1 :(得分:0)

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

此外,当您还想要包含jquery时,requirejs站点suggests使用require-jquery.js而不是require.js。我总是毫无问题地使用它。