使用TypeScript,AMD,“requirejs”,“breeze”但不是“angular”,我只是从Breeze 1.4.0升级到1.4.6。现在,当加载“breeze”时,它也会尝试加载“angular”,它会失败...
Module name "angular" has not been loaded yet for context: _.
Use require([]) http://requirejs.org/docs/errors.html#notloaded
问题似乎是由于Breeze执行以下行。
var ng = core.requireLib("angular");
我做错了所以这个代码执行了吗?为什么Breeze认为必须加载Angular?
用以下内容替换上述行时,一切正常。
var ng = undefined;
答案 0 :(得分:1)
我很难复制这个。
是的,由于Breeze代码的特殊性,即使角度不存在,Breeze也会执行以下行
var ng = core.requireLib("angular");
......那将失败
Module name "angular" has not been loaded yet for context
因为它找不到名为angular.js的库(我假设你没有它)
但是失败发生在__requireLibCore
try/catch
)内
function __requireLibCore(libName) {
var lib;
try {
if (this.window) {
...
if (window.require) {
lib = window.require(libName);
}
if (lib) return lib;
}
} catch(e) {
}
return lib;
您是否看到了引发此错误的其他代码路径?
感谢@mgs,您的电子邮件说明了您如何看待异常。我总结了那些后来读到这篇文章的人。
Breeze在v.1.4.6中开始寻找AngularJS。要非常清楚,Breeze 不需要棱角分明;它只是想知道角度是否可用。 Breeze也不需要淘汰赛,jQuery或Q.但在不同的情况下,它可能会寻找这些库,并在找到它们时使用它们。
AFAIK在requireJS中没有其他方法来检测模块是否已加载然后调用require("angular")
。不幸的是,require("angular")
在无法找到该模块时抛出异常。
Breeze本身不会失败,因为该调用是在try / catch中捕获的。许多(大多数?)开发人员永远不会看到这个例外。
但@mgs已经附加了一个requirejs.onError
事件处理程序 ...我赶紧添加是一个很好的做法。当然,即使Breeze抓住它并继续前进,他的处理程序也会看到“找不到角度”的异常。他写道:
当Breeze尝试加载Angular时,会调用“requirejs.onError”函数。在真实的程序中,这会导致进入日志,并且警报响铃。正是这个条目让我在StackOverflow上提出问题。
怎么办?我不认为Breeze可以做任何事情,除非有人知道如何在不触发requirejs.onError
事件的情况下检测已加载的模块。我认为应该由开发人员来弥补。
我建议教你的处理程序忽略Breeze尝试找到角度。对于这种特殊的故障,请不要发出“警钟”。
或者,你可以像@mgs一样定义一个虚拟模块,这样就需要找到一个“angular”模块。我并不喜欢这种方法,因为它让Breeze相信Angular是可用的,Breeze可能会对未来的误解采取行动。今天它是无害的,但谁知道明天。
无论如何,已经解释了这个谜团,现在已经知道了合适的解决方法。谢谢,@ mgs,有机会探索这个主题。
我们刚刚发布了Breeze v.1.4.7,其中包含您推荐的更改...使用require.defined
首先检查模块是否已加载。像魅力一样。
我借此机会重新编写Todo-Require sample,以便在一个需要的脚本行中加载所有内容:
<!-- Require + main. All scripts retrieved async by requireJS -->
<script data-main="Scripts/app/main" src="Scripts/require.js"></script>
文档解释了它是如何工作的。
感谢您的提问和反馈。
答案 1 :(得分:0)
您可以通过添加以下打字稿行来强制加载angularjs:
/// <amd-dependency path="angular"/>
或者,您可以在{require}配置中使breeze
依赖angular
。
更新如果您不使用angularjs ,您可以安全地从项目中排除此文件:https://github.com/IdeaBlade/Breeze/blob/master/Breeze.Client/Scripts/IBlade/b00_breeze.ajax.angular.js