Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 1afa0b6

Browse files
matskomhevery
authored andcommitted
feat(core_dom): introduce NgElement
1 parent 40265bf commit 1afa0b6

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

lib/core_dom/module.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ part 'tagging_view_factory.dart';
3030
part 'template_cache.dart';
3131
part 'tree_sanitizer.dart';
3232
part 'walking_compiler.dart';
33+
part 'ng_element.dart';
3334

3435
class NgCoreDomModule extends Module {
3536
NgCoreDomModule() {
@@ -58,6 +59,7 @@ class NgCoreDomModule extends Module {
5859
type(DirectiveMap);
5960
type(DirectiveSelectorFactory);
6061
type(ElementBinderFactory);
62+
type(NgElement);
6163
}
6264
}
6365

lib/core_dom/ng_element.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
part of angular.core.dom;
2+
3+
class NgElement {
4+
5+
final dom.Element node;
6+
final Scope _scope;
7+
final NgAnimate _animate;
8+
final _classes = new Map<String, bool>();
9+
10+
NgElement(this.node, this._scope, NgAnimate this._animate);
11+
12+
addClass(String className) {
13+
if(_classes.isEmpty) {
14+
_listenOnWrite();
15+
}
16+
_classes[className] = true;
17+
}
18+
19+
removeClass(String className) {
20+
if(_classes.isEmpty) {
21+
_listenOnWrite();
22+
}
23+
_classes[className] = false;
24+
}
25+
26+
_listenOnWrite() {
27+
_scope.rootScope.domWrite(() => flush());
28+
}
29+
30+
flush() {
31+
_classes.forEach((className, status) {
32+
status == true
33+
? _animate.addClass(node, className)
34+
: _animate.removeClass(node, className);
35+
});
36+
_classes.clear();
37+
}
38+
}

test/core_dom/ng_element_spec.dart

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
library ng_element_spec;
2+
3+
import '../_specs.dart';
4+
import 'dart:html' as dom;
5+
6+
void main() {
7+
describe('ngElement', () {
8+
9+
it('should add classes on domWrite to the element',
10+
inject((TestBed _, NgAnimate animate) {
11+
12+
var scope = _.rootScope;
13+
var element = _.compile('<div></div>');
14+
var ngElement = new NgElement(element, scope, animate);
15+
16+
ngElement.addClass('one');
17+
ngElement.addClass('two three');
18+
19+
['one','two','three'].forEach((className) {
20+
expect(element.classes.contains(className)).toBe(false);
21+
});
22+
23+
scope.apply();
24+
25+
['one','two','three'].forEach((className) {
26+
expect(element.classes.contains(className)).toBe(true);
27+
});
28+
}));
29+
30+
it('should remove classes on domWrite to the element',
31+
inject((TestBed _, NgAnimate animate) {
32+
33+
var scope = _.rootScope;
34+
var element = _.compile('<div class="one two three four"></div>');
35+
var ngElement = new NgElement(element, scope, animate);
36+
37+
ngElement.removeClass('one');
38+
ngElement.removeClass('two');
39+
ngElement.removeClass('three');
40+
41+
['one','two','three'].forEach((className) {
42+
expect(element.classes.contains(className)).toBe(true);
43+
});
44+
expect(element.classes.contains('four')).toBe(true);
45+
46+
scope.apply();
47+
48+
['one','two','three'].forEach((className) {
49+
expect(element.classes.contains(className)).toBe(false);
50+
});
51+
expect(element.classes.contains('four')).toBe(true);
52+
}));
53+
54+
it('should always apply the last dom operation on the given className',
55+
inject((TestBed _, NgAnimate animate) {
56+
57+
var scope = _.rootScope;
58+
var element = _.compile('<div></div>');
59+
var ngElement = new NgElement(element, scope, animate);
60+
61+
ngElement.addClass('one');
62+
ngElement.addClass('one');
63+
ngElement.removeClass('one');
64+
65+
expect(element.classes.contains('one')).toBe(false);
66+
67+
scope.apply();
68+
69+
expect(element.classes.contains('one')).toBe(false);
70+
71+
element.classes.add('one');
72+
73+
ngElement.removeClass('one');
74+
ngElement.removeClass('one');
75+
ngElement.addClass('one');
76+
77+
expect(element.classes.contains('one')).toBe(true);
78+
}));
79+
});
80+
}

0 commit comments

Comments
 (0)