我正在努力处理所有脚本#Dependency loading。
我有一个脚本#Project引用了淘汰库。我在使用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']
}
});
答案 0 :(得分:3)
听起来Script#假设ko
和ko.mapping
在全局命名空间中,而不是作为AMD加载。但是,Knockout和Knockout.mapping被编码为当它们检测到AMD / RequireJS时,它们不使用全局命名空间。
有两种方法可以解决这个问题:
1 - 在调用require.config之后立即注入(基于下面的注释),而不是等待实际请求knockout或knockout.mapping
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地图配置,这样无论何时你请求'knockout'或'knockout.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'}
}
});
答案 1 :(得分:0)
此示例(https://github.com/nikhilk/scriptsharp/tree/cc/samples/KOWorld)显示使用脚本#+ knockout以及requirejs作为AMD加载程序。
请务必在AssemblyInfo.js中查看脚本模板,以便完成所有这些工作。
希望这会有所帮助。