0

据我所知,Durandal 2.x 假定没有全局库。这是从文档中截取的用于定义全局模块的代码:

define('jquery', function () { return jQuery; });
define('knockout', function () { return ko; });

如果我理解正确的目的,这些依赖项应该在模块中以下列方式使用:

define(['jquery', 'ko'],
    function (jquery, ko) {
         debugger;
    });

但是这些依赖项(jquery, ko)都没有在模块的范围内定义。你能帮我弄清楚我在这里错过了什么吗?

4

1 回答 1

1

有两种方法可以在 Durandal 中加载淘汰赛和 jQuery(以及其他第三方库)。

通过脚本标签

<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
<script type="text/javascript" src="~/Scripts/knockout-2.3.0.js"></script>
<script type="text/javascript" src="~/Scripts/bootstrap.js"></script>

例如,请参阅 Microsoft .NET 示例 https://github.com/BlueSpire/Durandal/blob/master/platforms/Microsoft.NET/Samples/Durandal.Samples/Views/Home/Index.cshtml#L31

在这种情况下,您将使用上述语法让 requirejs 知道这些库已经加载,因为 Durandal 内部将它们用作 AMD 模块。但是,在您自己的模块中,您可以省略此声明,因为 'ko' 和 '$' 是全局可访问的。

对于某些人来说,这是一种务实的方式,因为它更容易处理与 AMD 不兼容的第三方库。

如果避免全局变量是重中之重,那么也可以这样配置 requirejs。

通过 requierejs 加载所有内容。只需要一个脚本标签

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

例如,请参阅 HTML 示例https://github.com/BlueSpire/Durandal/blob/master/platforms/HTML/Samples/index.html#L43

在 main.js 中有一个requirejs.config带有路径和 shim 配置的对象。有关完整的可用选项,请参阅http://requirejs.org/docs/api.html

main.js

requirejs.config({
    paths: {
        'text': '../lib/require/text',
        'durandal':'../lib/durandal/js',
        'plugins' : '../lib/durandal/js/plugins',
        'transitions' : '../lib/durandal/js/transitions',
        'knockout': '../lib/knockout/knockout-2.3.0',
        'bootstrap': '../lib/bootstrap/js/bootstrap',
        'jquery': '../lib/jquery/jquery-1.9.1'
    },
    shim: {
        'bootstrap': {
            deps: ['jquery'],
            exports: 'jQuery'
        }
    }
});

例如https://github.com/BlueSpire/Durandal/blob/master/platforms/HTML/Samples/app/main.js

这次在您自己的模块中,您必须将 'knockout' 和 'jquery' 声明为依赖项(如果您使用它们),否则 requirejs 会抛出错误。

于 2013-11-11T17:31:28.137 回答