使用Breeze和RequireJS,加载Angular

时间:2013-12-09 08:04:59

标签: angularjs requirejs typescript breeze amd

使用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;

2 个答案:

答案 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;

您是否看到了引发此错误的其他代码路径?

2013年12月11日更新

感谢@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,有机会探索这个主题。

2013年12月12日更新

我们刚刚发布了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