如何配置Require JS来加载依赖于KnockoutJS的JS文件?

时间:2015-12-17 09:11:24

标签: javascript knockout.js requirejs

我偶然发现this post有一个可能的解决方案,但它没有工作,我收到同样的错误ko is not define

我把它放在它自己的JS文件中,因为我假设knockout.inject需要在原始文章中解释的模块中。{/ p>

define('knockout.inject', ['knockout'], function (k) {
    window.ko = k;
    return k;
});

然后:

require.config({

    paths: {
         knockout: 'Path to knockout',
        // This is the file
         knockoutbindings: 'knockout.bindings.orderable'
    },

    shim: {

        "knockoutbindings": {
            deps: ["knockout"]
        },
        map: {
            // inject ko back in the global namespace
            '*': {
                'knockout': 'knockout.inject'
            },
            // prevent cycles
            'knockout.inject': { 'knockout': 'knockout' }
        }
    }
});

但是,我不确定如何实例化该文件,我收到错误:ko is undefined。后跟文件和目录的名称。

使用淘汰赛映射,我所要做的就是:

ko.mapping = komapping;

如何实例化此文件?

1 个答案:

答案 0 :(得分:0)

如果您使用require,直接或作为依赖项加载koko未定义为全局变量,因此,您的非AMD插件无法附加到{{ 1}}。

有两种解决方案:

  1. 修改您的插件,使其符合标准。这意味着将ko作为模块的依赖项加载,并在模块中对ko的本地引用中包含插件函数

  2. 使用ko,这不是最佳解决方案,但如果您不想将插件重新定义为符合AMD标准的模块,则更容易。

  3. 但是请不要混合使用这两种模式,因为你最终会添加shims的本地版本,这些版本与全局版本不同。

    您可以在此处找到有关如何使用填充程序的详尽说明:How to use requirejs with jQuery。在这里,当您拥有不符合AMD标准的插件时,您将找到使用垫片的详细信息。在这种情况下,问题和解决方案是针对非AMD jQuery插件进行彻底解释的,但是ko插件的工作方式完全相同。