RequireJS大约一半的时间对我有用。如果我刷新页面,它会随机出现加载问题。
我正在调整一个小型MVC项目来使用它,并做这样的事情:How does RequireJS work with multiple pages and partial views?
我有一个常见的main.js,可以从我的主_layout.cshtml进行加载。以及使用上述技术的小部件和其他地方的其他部分视图。以下示例来自我的SignIn页面:
<script type="text/javascript">
require(["jquery", "kendo", "domReady!"], function ($, kendo) {
$("#signInForm").kendoWindow({
draggable: false,
width: "500px",
modal: true,
title: "Sign In",
resizable: false
});
});
</script>
有时Chrome会加载&amp;在main.js之前处理内联脚本(其中定义了路径映射和其他配置)。要求“domReady”没有任何区别。
如何强制此脚本等到require.js&amp; main.js已经运行了吗?
不太理想的后备是将jQuery返回到它的全局范围并使用某种自定义事件。你有更好的主意吗?或者是否有一种内置于RequireJS的方法?
更新:这是我现在在_layout.cshtml中使用的工作
<script src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")" type="text/javascript"></script>
<script type="text/javascript">
function requireIt(requirements, callback) {
if ($(document).data("requireReady") === true) {
require(requirements, callback);
} else {
$(document).bind("requireReady", null, function () {
$(document).data("requireReady", true);
require(requirements, callback);
});
}
}
</script>
<script data-main="/scripts/main" src="@Url.Content("~/Scripts/require.js")" type="text/javascript"></script>
jQuery返回成为全局夹具,我的部分视图使用其内联脚本使用此requireIt包装器。并且main.js触发requireReady。
答案 0 :(得分:1)
在require.js网站上找到了这个:
理想情况下,您加载的脚本将是通过调用define()定义的模块。但是,您可能需要使用一些传统/遗留的“浏览器全局”脚本,这些脚本不通过define()表达它们的依赖关系。对于那些,您可以使用shim配置。要正确表达他们的依赖关系。
Link到shim配置文档
如果不表达依赖关系,则可能会出现加载错误,因为RequireJS异步加载脚本并且速度不正常。
您可以在require.js documentation了解更多信息,点1:加载javascript文件。
我今晚会试验它,因为我现在没有时间。但我可以想象它会解决我的问题,所以可能也是你的问题。
答案 1 :(得分:1)
继乔纳斯的回答,并且乱了好几天后,我发现从_Layout.cshtml执行此操作的唯一方法如下(脚本标记位于标题中)。我还在各种教程中看到了主体中的脚本标签,这似乎不起作用。
<script type="text/javascript" src="~/js/lib/require.js"></script>
<script type="text/javascript">
require.config({
baseUrl: 'js/lib',
paths: {
jquery: 'jquery-1.8.2',
kendo: 'kendo.all-2012.2.913.min',
underscore: 'underscore.min',
backbone: 'backbone.min',
app: '../app'
},
shim: {
underscore: {
exports:'_'
},
Backbone: {
deps: ['jquery', 'underscore'],
exports: "Backbone"
}
}
});
</script>
我无法理解为什么对main.js的引用不起作用(所以我从_Layout.cshtml中删除了它)
<script data-main="js/main.js" src="~/js/lib/require.js" type="text/javascript"></script>
我还根据dox简化了js文件夹的布局:
website
.....js
.....js/lib
.....js/lib/jquery-1.8.2.js
.....js/lib/underscore.js
.....etc
.....js/app
.....js/app/myscript.js
.....etc
希望这有帮助
杰里米