javascript – BreezeJS和RequireJS无法按预期工作

前端之家收集整理的这篇文章主要介绍了javascript – BreezeJS和RequireJS无法按预期工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将breezeJS集成到已经使用knockoutJS的现有requireJS项目中.我遇到了几个问题.

第一个是breeze无法加载Q库,除非我将它作为< script>包含在我的html包装器上.标记,而不是加载的AMD依赖项.在我的项目中,我试图将我的代码保持为单个脚本标记,所以这不是理想的.

第二个问题是breezeJS无法加载淘汰赛.在我的main.js中,我已经为淘汰定义了一条路径:

淘汰赛:’../libs/knockout/knockout-2.2.0′,

(我这样做是因为我喜欢确定我没有访问全局ko)

然而,当我为我的项目添加微风时,微风无法加载我的淘汰库.查看微风代码,我可以看到它被硬编码加载淘汰库为ko.

不想改变我的所有代码我发现我可以将我的AMD加载的挖空库添加到全局窗口对象作为窗口[‘ko’].但这感觉就像一个混蛋.还奇怪地以这种方式添加Q并删除< script>标签不起作用,因为我认为Q在应用程序的生命周期中需要得太早,甚至在我污染全局之前 – 我确实在main.js中嵌套了我的require()调用但是隐藏了我的大多数应用程序文件构建过程让我放弃了这种方法.

如何在我的项目中包含Q和knockout和breeze,仍然使用单行< script>标签,目前我不得不将Q作为单独的< script>包含在内.标记并污染全局以获得微风和淘汰赛以发挥得很好.

我在我的项目中使用了很多其他库,但没有一个难以集成.

任何帮助深表感谢

干杯

GAV

编辑:这是我的完整需求配置:

require.config({
    /**
    * shims are for 3rd party libraries that have not been written in AMD format.
    * shims define AMD modules definitions that get created at runtime.
    */
    shim: {
        'jqueryUI': { deps: ['jquery'] },'jqueryAnimateEnhanced': { deps: ['jqueryUI'] },'jqueryScrollTo': { deps: ['jquery'] },'touchPunch': { deps: ['jquery'] },//'Q': { exports: 'Q' },//'breeze': { deps: ['Q','knockout'],exports: 'breeze' },'path': { exports: 'Path' },//'signalR': { deps: ['jquery'] },},paths: {
        //jquery
        jquery: '../libs/jquery/jquery-1.7.2.min','jquery.adapter': '../libs/jquery/jquery.adapter',//jquery plugins
        horizontalNav: '../libs/jquery/plugins/horizontalNav/jquery.horizontalNav',jqueryUI: '../libs/jquery/plugins/jquery-ui/jquery-ui-1.9.2.custom',jqueryAnimateEnhanced: '../libs/jquery/plugins/animate-enhanced/jquery.animate-enhanced',touchPunch: '../libs/jquery/plugins/touch-punch/jquery.ui.touch-punch.min',//jqueryScrollTo: '../libs/jquery/plugins/jquery-scrollTo/jquery.scrollTo.min',//reveal: '../libs/jquery/plugins/reveal/jquery.reveal',//opentip: '../libs/jquery/plugins/opentip/opentip-jquery',//RequireJS
        domReady: '../libs/require/plugins/domReady',text: '../libs/require/plugins/text',async: '../libs/require/plugins/async',depend: '../libs/require/plugins/depend',json: '../libs/require/plugins/json',noext: '../libs/require/plugins/noext',//coffee-script
        'coffee-script': '../libs/coffee/coffee-script',cs: '../libs/require/plugins/cs',//Path
        path: '../libs/path/path.min',//Knockout
        knockout: '../libs/knockout/knockout-2.2.0',knockoutTemplateSource: '../libs/knockout/ko.templateSource',knockoutValidation: '../libs/knockout/ko.validation',//breeze
        Q: '../libs/breeze/q',breeze: '../libs/breeze/breeze.debug',//Signals (Observer pattern)
        signals: '../libs/signals/signals',//SignalR - Push notifications
        signalR: '../libs/signalR/jquery.signalR-0.5.2.min',//utils
        logger: 'common/logging/logger',tinycolor: '../libs/tinycolor/tinycolor',composing: 'common/composition/composing',//app specific
        BaseWidgetviewmodel: 'app/view/core/BaseWidgetviewmodel',}
});

解决方法

抱歉(假期)延迟解决您的问题.

我理解并感谢您删除除了RequireJS之外的每个脚本标记的目标.根据我的经验,这个目标并不容易.

你确实发现了一个Breeze缺陷. Breeze内部引用了与应用程序“require”功能不同的“require”功能.它不知道应用程序’require’功能或其配置.因此,当您省略Q脚本标记时,无论您如何配置应用程序’require’,Breeze都找不到Q …

我们必须解决这个问题.我们会在这里添加评论.

同时,您必须使用’Q’和’KO’的脚本标记,并且必须将这些标记放在RequireJs的脚本标记之上.请继续对您的应用程序脚本使用require.

不幸的是,您还有其他与双重需求函数问题无关的问题.

首先,我认为你总是难以让KO远离全局命名空间……这与Breeze无关.

在KO的AMD实现中(至少在我上次查看时),KO要么在全局命名空间中,要么在require容器中;从来没有.不幸的是,许多有用的插件(bindingHandlers,debug.helpers)假设它在全局命名空间中;如果您使用require加载KO,您将无法使用它们.

您可以在需要之前在脚本标记中加载Knockout,然后在配置期间将KO填充到Require容器中.您的配置可能如下所示:

define('knockout',[],function () { return window.ko; });

jQuery开发人员意识到这将是一个问题.太多好的插件假设jQuery在全局命名空间中. jQuery维护者(在我看来是正确的)将jQuery放在Require容器和全局命名空间中,而不是纯粹主义者.

其次,许多其他有用的库不支持Require.您的代码可以编写为好像这些脚本是为require设计的.我仍然认为处理这个问题最简单,最清晰的方法是在脚本标记中指定它们.然后,您可以通过定义调用将它们添加到容器中,如上所示.通过这种填充,您自己的模块可以依赖于需要服务位置和依赖注入这些库.

第三,我认为您的配置存在错误.出于逃避我的原因,您决定将Knockout模块称为Require world中的“knockout”.

很好……但是当我们修复它以使用应用程序的require容器时,你不应该期望Breeze预期模块名称. Breeze将以其标准名称“ko”寻找KnockoutJs. Breeze不会以您的首选名称“淘汰”找到它.

这不是什么大问题.如果您坚持使用“淘汰”名称,则可以在两个名称下使用相同的实例.我很确定添加到配置代码后,以下填充行将起作用:

define('ko',['knockout'],function (ko) { return ko; });

再次……只有在我们修复了Breeze需要的bug之后,这才会有效.

约翰帕帕必须解决许多类似的问题in Code Camper;你可能会看看他在那里做了什么,特别是在main.js.

原文链接:https://www.f2er.com/js/158160.html

猜你在找的JavaScript相关文章