Skip to content

Commit 9ad2a68

Browse files
committed
fix(introspection): Better error messages and checked mode support
1 parent 5a36e77 commit 9ad2a68

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

lib/introspection.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ var _elementExpando = new Expando('element');
1515
* function is not intended to be called from Angular application.
1616
*/
1717
ElementProbe ngProbe(dom.Node node) {
18+
if (node == null) {
19+
throw "ngProbe called without node";
20+
}
21+
var origNode = node;
1822
while(node != null) {
1923
var probe = _elementExpando[node];
2024
if (probe != null) return probe;
2125
node = node.parent;
2226
}
27+
throw "Could not find a probe for [$origNode]";
2328
return null;
2429
}
2530

@@ -76,12 +81,12 @@ List<Object> ngDirectives(dom.Node node) {
7681
}
7782

7883
_publishToJavaScript() {
79-
// Point of style here: cascades require too many ()s, reducing readability.
80-
js.context['ngProbe'] = (dom.Node node) => _jsProbe(ngProbe(node));
81-
js.context['ngInjector'] = (dom.Node node) => _jsInjector(ngInjector(node));
82-
js.context['ngScope'] = (dom.Node node) => _jsScope(ngScope(node));
83-
js.context['ngQuery'] = (dom.Node node, String selector, [String containsText]) =>
84-
new js.JsArray.from(ngQuery(node, selector, containsText));
84+
js.context
85+
..['ngProbe'] = new js.JsFunction.withThis((_, dom.Node node) => _jsProbe(ngProbe(node)))
86+
..['ngInjector'] = new js.JsFunction.withThis((_, dom.Node node) => _jsInjector(ngInjector(node)))
87+
..['ngScope'] = new js.JsFunction.withThis((_, dom.Node node) => _jsScope(ngScope(node)))
88+
..['ngQuery'] = new js.JsFunction.withThis((_, dom.Node node, String selector, [String containsText]) =>
89+
new js.JsArray.from(ngQuery(node, selector, containsText)));
8590
}
8691

8792
js.JsObject _jsProbe(ElementProbe probe) {

test/introspection_spec.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,19 @@ void main() {
3838
});
3939

4040
// Does not work in dart2js. deboer is investigating.
41-
xit('should be available from Javascript', () {
42-
ngBootstrap(element: new Element.html('<div></div>'));
41+
it('should be available from Javascript', () {
42+
// The probe only works if there is a directive.
43+
var elt = $('<div ng-app id=ngtop ng-bind="\'introspection FTW\'"></div>')[0];
44+
// Make it possible to find the element from JS
45+
document.body.append(elt);
46+
ngBootstrap(element: elt);
47+
4348
expect(js.context['ngProbe']).toBeDefined();
4449
expect(js.context['ngScope']).toBeDefined();
4550
expect(js.context['ngInjector']).toBeDefined();
4651
expect(js.context['ngQuery']).toBeDefined();
52+
53+
expect(js.context['ngProbe'].apply([js.context['ngtop']])).toBeDefined();
4754
});
4855
});
4956
}

0 commit comments

Comments
 (0)