2014-10-28 6 views
7

Я ожидаю получить что-то из изолированного объема из своей директивы help-button.AngularJS jasmine isolateScope() возвращает undefined

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' 

Возникает вопрос: почему я получаю обратно неопределенными? Даже если в изолированной области нет ничего, он все равно должен быть пустым {} объектом. Но в любом случае - тест неправильный - он не показывает изолированный объем, который (в реале) содержит данные там.

ответ

6

Я глуп.

Но ответит на мой собственный вопрос, потому что «глупость так же глупо» - то есть может быть один раз сделает то же самое (или для себя из будущего).

Проблема была в моем helpbutton.html, который использует моя директива (который я не показывал/не упоминал в этом вопросе).

Для того, чтобы templateUrl ссылался на файл helpbutton.html, который должен быть скомпилирован в html правильно.

Как только я посмотрел на вывод el.html(), я понял, что он не был должным образом отображен (были некоторые отсутствующие теги или что-то еще).

Thant's почему я не смог получить scope от element.

(хотя было бы неплохо иметь какое-то исключение в журнале, если шаблон не был надлежащим образом оказанных HTML)

+5

Так как вы исправили проблему с html? – joncodo

+0

Вы должны отметить свой собственный ответ как правильный ответ. – mostruash

1

Просто столкнулся с той же проблемой, но с другой причиной. На всякий случай, если кто-то другой имеет такую ​​же проблему, и это, вероятно, действительно очевидно, когда вы видели это раньше, но все же.

Если вы используете templateUrl, функция .isolateScope() вернется не определенно до тех пор, пока вы не назовете. $ Digest и $ httpBackend.flush();

Когда вы используете шаблон непосредственно из директивы, он будет доступен в тот момент, когда вы выполните $ compile (element) (scope).

Это может стать неожиданностью, если вы только что изменили директиву использования шаблонаUrl или изменили его с обычного на 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 
Смежные вопросы