requirejs knockout和mustache - 如何在脚本范围中注入符号?

时间:2013-05-11 13:09:19

标签: knockout.js requirejs mustache amd

我尝试使用:requirejs,jquery,knockout和mustache来构建彩色国际象棋游戏应用程序。

我在github和脚本上找到了用小胡子扩展淘汰赛的模板系统,但我无法在我的代码中干净地整合它。这个脚本假定在它里面定义了'ko'符号(它是一种插件)但是我得到了一个引用错误:'ko'没有被定义......

我有以下目录布局:

project/
  www/
    index.html
    js/
      app.js
      app/
        colorchess.js
        ui.js
      libs/
        jquery.js
        ko-min.js
        ko.mustache.js
        mustache.js
        require.js

以及以下JS文件:

- app.js -

requirejs.config({

baseUrl : "js/app",
paths : {
    "app" : "./app",
    "jquery" : "../lib/jquery",
    "ko" : "../lib/ko-min",
    "mustache" : "../lib/mustache",
    "ko.mustache" : "../lib/ko.mustache"
},
shim : {
    'ko.mustache' : ['ko', 'mustache']
}
});

requirejs(["colorchess"]);

- colorchess.js -

require(['ui'], function() {

   ... main game logic ...

})

- ui.js -

define(['jquery', 'ko'], function(jquery, ko) {
    console.log(ko);

            // BUG HERE (in this require)
    require(['ko.mustache'], function() {

        console.log('ko.mustache');

    });

});

所以我的问题肯定是:如何将'ko'符号全局变为'ko.mustache.js'脚本范围并修复ReferenceError错误?

此致

1 个答案:

答案 0 :(得分:0)

问题是ko.mustache期望ko在全局命名空间中可用。当使用RequireJS时,它们不会暴露给全局,而是作为模块返回并作为参考传递。

  1. 将ko.mustache包含到依赖于komustache的define中。那你就不需要垫片了。哪个更干净。

  2. ko.mustache上调用require之前,将ko和mustache作为全局变量展开:

  3. 样品:

    define(['jquery', 'ko', 'mustache'], function (jquery, ko, mustache) {
        console.log(ko);
    
        window.ko = ko;
        window.Mustache = mustache;
    
        require(['ko.mustache'], function () {  console.log('ko.mustache'); });
    });