首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将angular-scenario与requirejs一起使用

如何将angular-scenario与requirejs一起使用
EN

Stack Overflow用户
提问于 2013-03-19 20:50:14
回答 3查看 1.9K关注 0票数 7

当您的angular应用程序在DOM ready上就绪时,Angular-scenario工作得很好。不是这种情况时,使用要求或其他AMD库。如何在angular场景中添加对AMD的支持?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-19 20:50:14

你要做的是覆盖默认的帧加载行为,并在你和应用程序准备好的时候发出一个新的事件。

第一件事是在您的angular应用程序中添加以下代码行以及angular.bootstrap调用。此数据是angular-scenario所必需的。

代码语言:javascript
复制
angular.bootstrap(document, ['app']);

var html = document.getElementsByTagName('html')[0];

html.setAttribute('ng-app', 'app');
html.dataset.ngApp = 'app';

if (top !== window) {
    top.postMessage({
        type: 'loadamd'
    }, '*');
}

接下来,在您的e2e运行器中,您必须包含这些行。如果它是一个外部脚本,那么它必须在angular-scenario之后加载,并且必须在DOM准备好之前进行解析:

代码语言:javascript
复制
/**
 *  Hack to support amd with angular-scenario
 */
(function() {
    var setUpAndRun = angular.scenario.setUpAndRun;

    angular.scenario.setUpAndRun = function(config) {
        if (config.useamd) {
            amdSupport();
        }
        return setUpAndRun.apply(this, arguments);
    };

    function amdSupport() {
        var getFrame_ = angular.scenario.Application.prototype.getFrame_;

        /**
         *  This function should be added to angular-scenario to support amd. It overrides the load behavior to wait from
         *  the inner amd frame to be ready.
         */
        angular.scenario.Application.prototype.getFrame_ = function() {
            var frame = getFrame_.apply(this, arguments);
            var load = frame.load;

            frame.load = function(fn) {
                if (typeof fn === 'function') {
                    angular.element(window).bind('message', function(e) {
                        if (e.data && e.source === frame.prop('contentWindow') && e.data.type === 'loadamd') {
                            fn.call(frame, e);
                        }
                    });
                    return this;
                }
                return load.apply(this, arguments);
            }

            return frame;
        };
    }
})();

最后,要启用amd配置,必须将属性ng-useamd添加到angular-scenario的脚本标记中。

代码语言:javascript
复制
<script type="text/javascript" src="lib/angular-1.0.3/angular-scenario.js" ng-autotest ng-useamd></script>

您现在可以开始了

使用angular-scenario v1.0.3测试

票数 9
EN

Stack Overflow用户

发布于 2013-05-15 02:18:45

上面的答案在我的场景中部分失败了(Angular 1.1.4,fresh Karma)。在调试视图中,它运行得很好,在正常的概述页面中,它失败了。我注意到一个额外的嵌套。

我将代码更改为对测试的应用程序的父iframe的消息。

代码语言:javascript
复制
if (top !== window) {
    window.parent.postMessage({
        type: 'loadamd'
    }, '*');
}
票数 4
EN

Stack Overflow用户

发布于 2014-06-06 21:22:03

公认的答案是绝对正确的,但遗憾的是,您必须将该代码放入页面中。

因此,如果有帮助,我为karma创建了一个预处理器,作为测试运行的一部分注入“修复”。

代码:https://github.com/tapmantwo/karma-ng-bootstrap-fix-preprocessor npm:https://www.npmjs.org/package/karma-ng-bootstrap-fix-preprocessor

请注意,只有当您通过karma提供文件时,这才有效。如果你在代理它们,它们不会经过预处理器。因此,作为另一种选择,我有一个ng-scenario的分支,它做一些类似的事情,允许手动引导的站点运行;

https://github.com/tapmantwo/karma-ng-scenario

这不是一个节点模块,所以您必须手动设置它,但最好(IMHO)有这样的东西,而不是仅仅为了让测试通过而感染生产代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15499997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档