我正在努力加载所有的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#假设ko
和ko.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中查看脚本模板,以使所有这些工作正常进行。
希望这将有所帮助并发挥作用。