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