AngularJS jasmine isolateScope()返回undefined

时间:2014-10-28 18:31:01

标签: javascript angularjs scope jasmine

我希望从help-button指令中获取隔离范围内的内容。

  it('should contain proper scope, depending on attributes', function() {

        var el = compile('<help-button context-id="1"></help-button>')(scope);
        scope.$digest();


        console.log("el: " + el);
        console.log('Isolated scope: ' + el.isolateScope());
   ..
   });

- 在每次测试之前

beforeEach(inject(function($compile, $rootScope, $injector) {

    compile = $compile;
    scope = $rootScope.$new(); ...

打印:

'el: [Object Object]'
'Isolated scope: undefined'

问题是:我为什么要回来未定义?即使在隔离范围内没有任何内容,它仍然应该是空的{}对象。但无论如何 - 测试是错误的 - 它没有显示孤立的范围(实际上)包含数据。

2 个答案:

答案 0 :(得分:6)

我很蠢。

但是会回答我自己的问题,因为“愚蠢是愚蠢的” - 也就是说,可能是曾经做过同样的事情(或者对未来的我来说)。

问题发生在我的helpbutton.html我的指令正在使用(我在这个问题中没有显示/提及)。

因此templateUrl指的是应该正确编译为html的helpbutton.html文件。

一旦我看到el.html()的输出,我得知它没有正确渲染(有一些遗失的标签或其他东西)。

Thant是我无法从scope获得任何element的原因。

(如果模板没有正确呈现给html,那么在日志上会出现某种异常会很好)

答案 1 :(得分:1)

刚刚碰到同样的问题,但原因不同。以防其他人有同样的问题,一旦你以前见过它,这可能是非常明显的,但仍然存在。

如果您使用的是templateUrl,那么.isolateScope()函数将返回undefined,直到您实际调用为止。$ digest和$ httpBackend.flush();

当您直接使用指令中的模板时,它会在您执行$ compile(element)(范围)时可用。

如果您刚刚更改了指令以使用templateUrl,或者将其从regular更改为isolateScope,那么这可能会让您大吃一惊。

        responseHtml = '<div></div>';
        $httpBackend.expectGET('template.html').respond(200, responseHtml);

        var html = '<widget></widget>';
        element = angular.element(html);
        var compiled = $compile(element)(scope);

        console.log(element.isolateScope()); // undefined

        $rootScope.$digest();

        console.log(element.isolateScope()); // undefined

        $httpBackend.flush();

        console.log(element.isolateScope()); // now it will be available