Skip to content

Commit bcd6e4c

Browse files
committed
feat(directive): add ng-non-bindable directive
1 parent 48e5012 commit bcd6e4c

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {Decorator} from 'core/annotations/annotations';
2+
3+
@Decorator({
4+
selector: '[ng-non-bindable]',
5+
compileChildren: false
6+
})
7+
export class NgNonBindable {
8+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import {describe, xit, it, expect, beforeEach, ddescribe, iit} from 'test_lib/test_lib';
2+
import {DOM} from 'facade/dom';
3+
import {Injector} from 'di/di';
4+
import {Lexer, Parser, ChangeDetector} from 'change_detection/change_detection';
5+
import {Compiler, CompilerCache} from 'core/compiler/compiler';
6+
import {DirectiveMetadataReader} from 'core/compiler/directive_metadata_reader';
7+
import {Decorator, Component} from 'core/annotations/annotations';
8+
import {TemplateConfig} from 'core/annotations/template_config';
9+
import {NgElement} from 'core/dom/element';
10+
import {NgNonBindable} from 'directives/ng_non_bindable';
11+
12+
export function main() {
13+
describe('ng-non-bindable', () => {
14+
var view, cd, compiler, component;
15+
beforeEach(() => {
16+
compiler = new Compiler(null, new DirectiveMetadataReader(), new Parser(new Lexer()), new CompilerCache());
17+
});
18+
19+
function createElement(html) {
20+
return DOM.createTemplate(html).content.firstChild;
21+
}
22+
23+
function createView(pv) {
24+
component = new TestComponent();
25+
view = pv.instantiate(null);
26+
view.hydrate(new Injector([]), null, component);
27+
cd = new ChangeDetector(view.recordRange);
28+
}
29+
30+
function compileWithTemplate(template) {
31+
return compiler.compile(TestComponent, createElement(template));
32+
}
33+
34+
it('should not interpolate children', (done) => {
35+
var template = '<div>{{text}}<span ng-non-bindable>{{text}}</span></div>';
36+
compileWithTemplate(template).then((pv) => {
37+
createView(pv);
38+
cd.detectChanges();
39+
expect(DOM.getText(view.nodes[0])).toEqual('foo{{text}}');
40+
done();
41+
});
42+
});
43+
44+
it('should ignore directives on child nodes', (done) => {
45+
var template = '<div ng-non-bindable><span id=child test-dec>{{text}}</span></div>';
46+
compileWithTemplate(template).then((pv) => {
47+
createView(pv);
48+
cd.detectChanges();
49+
var span = DOM.querySelector(view.nodes[0], '#child');
50+
expect(DOM.hasClass(span, 'compiled')).toBeFalsy();
51+
done();
52+
});
53+
});
54+
55+
it('should trigger directives on the same node', (done) => {
56+
var template = '<div><span id=child ng-non-bindable test-dec>{{text}}</span></div>';
57+
compileWithTemplate(template).then((pv) => {
58+
createView(pv);
59+
cd.detectChanges();
60+
var span = DOM.querySelector(view.nodes[0], '#child');
61+
expect(DOM.hasClass(span, 'compiled')).toBeTruthy();
62+
done();
63+
});
64+
});
65+
})
66+
}
67+
68+
@Component({
69+
selector: 'test-cmp',
70+
template: new TemplateConfig({
71+
inline: '', // each test swaps with a custom template.
72+
directives: [NgNonBindable, TestDecorator]
73+
})
74+
})
75+
class TestComponent {
76+
text: string;
77+
constructor() {
78+
this.text = 'foo';
79+
}
80+
}
81+
82+
@Decorator({
83+
selector: '[test-dec]'
84+
})
85+
class TestDecorator {
86+
constructor(el: NgElement) {
87+
DOM.addClass(el.domElement, 'compiled');
88+
}
89+
}

0 commit comments

Comments
 (0)