Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 区别于;Q";及;q";在angularjs和requirejs中_Javascript_Angularjs_Requirejs_Breeze_Q - Fatal编程技术网

Javascript 区别于;Q";及;q";在angularjs和requirejs中

Javascript 区别于;Q";及;q";在angularjs和requirejs中,javascript,angularjs,requirejs,breeze,q,Javascript,Angularjs,Requirejs,Breeze,Q,我正在创建一个基于AngularJS、Breeze和RequireJS的单页应用程序。在使用requirejs设置AMD以使用Angular和Breeze时,我遇到了Breeze依赖于“q”的问题。如果“q”的配置规则为小写,即使“shim”中没有显式导出,Breeze也会给出以下错误: Uncaught Error: Unable to initialize Q. See https://github.com/kriskowal/q "http://localhost:1498/Scripts

我正在创建一个基于AngularJS、Breeze和RequireJS的单页应用程序。在使用requirejs设置AMD以使用Angular和Breeze时,我遇到了Breeze依赖于“q”的问题。如果“q”的配置规则为小写,即使“shim”中没有显式导出,Breeze也会给出以下错误:

Uncaught Error: Unable to initialize Q. See https://github.com/kriskowal/q
"http://localhost:1498/Scripts/shared/breeze.js"breeze.js:1`
当require-config将所有引用从“q”更改为“q”(即使没有导出),代码也可以工作。有人知道为什么会这样吗

这是工作要求配置:

require.config({
    baseUrl: '../Scripts',
    paths: {
        angular: 'shared/angular',
        bootstrap: 'shared/ui-bootstrap',
        dropdowns: 'app/directives/dropdowns',
        employeeApp: 'app/modules/employeeModule',
        controllers: 'app/controllers',
        dates: 'app/directives/dates',
        jquery: 'shared/jquery',
        Q: 'shared/q',
        breeze: 'shared/breeze',
        config: 'app/services/config',
        model: 'app/services/model',
        dataservice: 'app/services/dataservice',
        expenseInfo: 'app/services/expenseInfo'
    },
    shim: {
        'angular': { 'exports': 'angular' },
        'bootstrap': { deps: ['angular'] },
        //'q': { 'exports': 'q' },
        'breeze': { deps: ['Q', 'jquery'], 'exports': 'breeze' }
    },
    priority: [ 'angular', 'bootstrap', 'dropdowns', 'jquery',
                'Q', 'breeze', 'employeeSearch', 'dates' ]
});

技术上的原因是breeze显式地查找“Q”。要找到所有的微风,需要在源代码中搜索“requireLib”(不是整个单词)

Breeze总是首先寻找全局,因为q的全局是“q”,这就是Breeze搜索的

更多背景:(是的,我最近经历了微风+需求的痛苦)

幸运的是,您可以更改require路径。但是,对于淘汰赛+杜兰达尔,这不起作用。Breeze需要“ko”,但Durandal需要“knockout”。解决方法是使用RequireJS映射:

map: {
    //knockout used by Durandal, ko used by breeze  --> anytime ko is requested, substitute knockout
    '*': { 'ko': 'knockout' }
}
Breeze的RequireJS依赖项确实存在一些问题,因为它没有预定义其依赖项(在其定义调用中没有列出依赖项)。这可能是因为它的一些依赖项是可配置的(你不想要淘汰,但我想要)。这就是为什么您需要垫片来确保在Breeze请求之前加载它们

jQuery具有异常的AMD行为。大多数库在运行时都会查找AMD库。如果他们找到AMD库(例如RequireJS),他们会将自己加载到其中(例如定义(…),并跳过将自己作为全局库加载。如果可以的话,jQuery会同时执行这两项操作(有充分的理由)。这意味着Breeze始终可以看到并加载全局jQuery,因此无需创建从Breeze的“jQuery”到RequireJS的“jQuery”的映射


顺便说一句,“即使没有出口”也无关紧要。垫片中的导出属性用于:加载后,使用全局“breeze”作为模块值。breeze没有看到RequireJS,而是将自己加载到其中,而shim忽略了导出。

虽然可以通过RequireJS加载所有模块,但从我的第一个答案开始,我发现了一些困难,这些困难让我觉得太麻烦了

如果您打算使用requireJs optomize(rjs)和almond来提供一个带有almond的精简AMD加载程序的组合js文件,那么您将发现一些库中存在错误。具体来说,我遇到了Breeze和Toastr的问题

optomizer需要显式定义语句,并显式命名依赖项。Breeze在加载变量依赖项名称时使用变量依赖项名称,因为它在运行时配置了依赖项

另一个问题是使用CDN文件。Almond不处理任何网络文件,因此必须预加载这些文件。jQuery是主要的CDN候选,但它是包括breeze在内的许多模块的需求。并且optomize shim不能依赖于任何CDN文件

我的解决方案

我用自己的贴片固定了一个视光器

但由于修复Breeze会很麻烦,所以我又回到了通过捆绑来预加载它。我还添加了我认为可以从CDN中获益的库

我通过ASP.Net捆绑包加载了breeze(及其先决条件)和CDN文件 然后在my main.js中的requireJs.config之前为requireJs定义它们

为了在我的生产代码中使用这些预定义的预加载,我将weyland-config.js配置为optomize的空

                'jquery':               'empty:',
                'knockout':             'empty:',
                'Q':                    'empty:',
                'breeze':               'empty:',

HTH

臭虫?查查沃德写的这篇文章——应该有助于让你知道为什么会发生这种情况,以及如何创建一个小作品around@PWKad,我认为这个bug更多的是与requireJS或BreezeJS有关,而不是与Angular有关。沃德的例子是兑现承诺。我认为这与q美元或Angular的承诺无关。不同之处在于需要'q'和'q'——如果使用'q'将不会加载有趣的是,在使用角度q而不是Breeze q时存在问题。无论哪种方式,Breeze也不依赖于jQuery,原因我知道。好吧,Breeze的默认适配器确实使用jQuery的.ajax。。。