Angular hasClass returns true 即使 class 不存在
Angular hasClass returns true even though the class is not present
在 "what are you doing, tbm?" 的另一篇激动人心的文章中,我有一个测试(诚然在 [更改] 之前通过,但现在)由于明显的 class 存在而失败,尽管所有努力否则证明。
上下文:
显示参赛者列表,每个参赛者都可以进行评分或评分。在参赛者的 div 内,相关(按类别)参赛者以摘要形式显示。直到参赛者自己通过自己的 div 进行评分后,才会显示参赛者的总分。此测试验证此行为。
测试:
it('related items are hidden until scored', function() {
expect(judgeService.entrants[2].rating.score).toBe(0);
var other = angular.element(element.find('.competition')[0]);
var score_container = other.find('div > div');
expect(score_container.hasClass('ng-hide')).toBe(true);
judgeService.entrants[2].rating.score = 3;
scope.$digest();
// We'll refer to this later
console.log('HTML: ' + other.html());
console.log('CLASS: ' + score_container.attr('class'));
// failure here
expect(score_container.hasClass('ng-hide')).toBe(false);
});
HTML:
<div class="competition"
ng-repeat="other in item.related">
<div>
{{ other.name }}<br/>
<!-- this becomes the div > div in the test -->
<score-block item="other" ng-show="other.rating.score"></score-block>
</div>
</div>
输出:
LOG: 'HTML:
<div class="ng-binding">
Andres<br>
<div class="ng-isolate-scope" ng-class="{error: vm.error}" item="other" ng-show="other.rating.score">
[ skippy bits ]'
LOG: 'CLASS: ng-isolate-scope'
所以,是的,class 不存在于元素上。那么为什么 hasClass() 认为它存在?
[更改]
根据 git 对分,导致测试开始失败的更改在不相关的指令中。但即使变化是直接相关的,我也看不出除了 hasClass() 之外的每个人如何报告 class 不存在。
更新:
通过 jquery 代码挖掘(hasClass() 使用 jquery 如果已安装)似乎 element.hasClass("foo") 将 return true 如果element 的任何子元素都具有 class "foo",即使 element 本身没有。卧槽,jquery?
显然这是由 'div > div' 选择器从父元素递归到具有 ng-hide class.
的子元素引起的
修复:
var score_container = other.find('div > div').eq(0);
在 "what are you doing, tbm?" 的另一篇激动人心的文章中,我有一个测试(诚然在 [更改] 之前通过,但现在)由于明显的 class 存在而失败,尽管所有努力否则证明。
上下文:
显示参赛者列表,每个参赛者都可以进行评分或评分。在参赛者的 div 内,相关(按类别)参赛者以摘要形式显示。直到参赛者自己通过自己的 div 进行评分后,才会显示参赛者的总分。此测试验证此行为。
测试:
it('related items are hidden until scored', function() {
expect(judgeService.entrants[2].rating.score).toBe(0);
var other = angular.element(element.find('.competition')[0]);
var score_container = other.find('div > div');
expect(score_container.hasClass('ng-hide')).toBe(true);
judgeService.entrants[2].rating.score = 3;
scope.$digest();
// We'll refer to this later
console.log('HTML: ' + other.html());
console.log('CLASS: ' + score_container.attr('class'));
// failure here
expect(score_container.hasClass('ng-hide')).toBe(false);
});
HTML:
<div class="competition"
ng-repeat="other in item.related">
<div>
{{ other.name }}<br/>
<!-- this becomes the div > div in the test -->
<score-block item="other" ng-show="other.rating.score"></score-block>
</div>
</div>
输出:
LOG: 'HTML:
<div class="ng-binding">
Andres<br>
<div class="ng-isolate-scope" ng-class="{error: vm.error}" item="other" ng-show="other.rating.score">
[ skippy bits ]'
LOG: 'CLASS: ng-isolate-scope'
所以,是的,class 不存在于元素上。那么为什么 hasClass() 认为它存在?
[更改]
根据 git 对分,导致测试开始失败的更改在不相关的指令中。但即使变化是直接相关的,我也看不出除了 hasClass() 之外的每个人如何报告 class 不存在。
更新:
通过 jquery 代码挖掘(hasClass() 使用 jquery 如果已安装)似乎 element.hasClass("foo") 将 return true 如果element 的任何子元素都具有 class "foo",即使 element 本身没有。卧槽,jquery?
显然这是由 'div > div' 选择器从父元素递归到具有 ng-hide class.
的子元素引起的修复:
var score_container = other.find('div > div').eq(0);