将ScriptSharp与Knockout一起使用.通过RequireJS进行映射



我正在努力加载所有的Script#Dependency。

我有一个Script#项目引用了淘汰库。在使用RequireJS一段时间后,我开始使用它。

现在我想使用KnockoutJS映射,它符合之类的东西

var model = ko.mapping.fromJS(data, {}, new ViewModel());

但是ko.mapping是未定义的。

如果我手动(仅用于测试)将编译的.js文件更改为包含如下映射:

define('MyApp',
    ['ss', 'jquery', 'knockout', knockout.mapping],
    function (ss, $, ko, mapping) { /*...*/ }
);

定义了"mapping",但没有定义为"ko.mapping",编译器就是这样引用它的。

有什么想法吗?

这是我的配置:

requirejs.config({
    paths: {
        'jquery': 'jquery-1.9.1',
        'jqueryValidation': 'jquery.validate',
        'knockout': 'knockout-2.2.0',
        'knockout.mapping': 'knockout.mapping-latest.debug',
        'modernizr': 'modernizr-2.6.2'
    },
    shim: {
        'jqueryValidation': ['jquery'],
        'jquery.validate.unobtrusive': ['jquery', 'jqueryValidation'],
        'jquery.unobtrusive-ajax': ['jquery'],
        'knockout.mapping': ['knockout']
    }
});

听起来Script#假设koko.mapping在全局命名空间中,而不是作为AMD加载。但是,Knockout和Knockout.mapping的编码使得当它们检测到AMD/RequireJS时,它们不使用全局命名空间。

有几个选项可以解决这个问题:

1-在require.config被调用后立即注入(基于下面的注释),而不是等待某个东西真正请求敲除或敲除。映射

requirejs.config({
    // same as original
});
require(["knockout", "knockout.mapping"], function (ko, m) {       
    ko.mapping = m; 
})

2-创建自己的包装器模块,将其注入全局。类似这样的东西:

define('knockout.inject', ['knockout'], function(k)
{
  window.ko = k; // make a ko global
  return k; // but also return what a normal AMD require expects
});
define('knockout.mapping.inject', ['knockout.mapping'], function(m)
{
  window.ko.mapping = m; // make a ko.mapping global
  return m; // but also return what a normal AMD require expects
});

然后,您可以进行RequireJS映射配置,以便每当您请求"knocket"或"knocket.mapping"时,它们都会透明地重新映射到您的上述包装器。

requirejs.config({
    paths: { // same as original },
    shim: { // same as original },
    map: {
      '*': {
        'knockout': 'knockout.inject',
        'knockout.mapping': 'knockout.mapping.inject'
      },
      // prevent cycles
      'knockout.inject': {'knockout': 'knockout'},
      'knockout.mapping.inject': {'knockout.mapping': 'knockout.mapping'}
    }
});

此示例(https://github.com/nikhilk/scriptsharp/tree/cc/samples/KOWorld)显示了使用脚本#+敲除以及requirejs作为AMD加载程序。

请务必在AssemblyInfo.js中查看脚本模板,以使所有这些工作正常进行。

希望这将有所帮助并发挥作用。

最新更新