-
Notifications
You must be signed in to change notification settings - Fork 248
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
part of angular.core.dom_internal; | ||
|
||
@proxy | ||
class ShadowlessShadowRoot implements dom.ShadowRoot { | ||
dom.Element _element; | ||
|
||
ShadowlessShadowRoot(this._element); | ||
|
||
noSuchMethod(Invocation invocation) { | ||
throw new UnimplementedError("Not yet implemented in ShadowlessShadowRoot."); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
part of angular.core.dom_internal; | ||
|
||
@Decorator( | ||
selector: 'content') | ||
class Content implements AttachAware, DetachAware { | ||
final ContentPort _port; | ||
final dom.Element _element; | ||
dom.Comment _beginComment; | ||
Content(this._port, this._element); | ||
|
||
void attach() { | ||
if (_port == null) return; | ||
_beginComment = _port.content(_element); | ||
} | ||
|
||
void detach() { | ||
if (_port == null) return; | ||
_port.detachContent(_beginComment); | ||
} | ||
} | ||
|
||
class ContentPort { | ||
dom.Element _element; | ||
var _childNodes = []; | ||
|
||
ContentPort(this._element); | ||
|
||
void pullNodes() { | ||
_childNodes.addAll(_element.nodes); | ||
_element.nodes = []; | ||
} | ||
|
||
content(dom.Element elt) { | ||
var hash = elt.hashCode; | ||
var beginComment = new dom.Comment("content $hash"); | ||
|
||
if (_childNodes.isNotEmpty) { | ||
elt.parent.insertBefore(beginComment, elt); | ||
elt.parent.insertAllBefore(_childNodes, elt); | ||
elt.parent.insertBefore(new dom.Comment("end-content $hash"), elt); | ||
_childNodes = []; | ||
} | ||
elt.remove(); | ||
return beginComment; | ||
} | ||
|
||
void detachContent(dom.Comment _beginComment) { | ||
// Search for endComment and extract everything in between. | ||
// TODO optimize -- there may be a better way of pulling out nodes. | ||
|
||
var endCommentText = "end-${_beginComment.text}"; | ||
|
||
var next; | ||
for (next = _beginComment.nextNode; | ||
next.nodeType != dom.Node.COMMENT_NODE && next.text != endCommentText; | ||
next = _beginComment.nextNode) { | ||
_childNodes.add(next); | ||
next.remove(); | ||
} | ||
assert(next.nodeType == dom.Node.COMMENT_NODE && next.text == endCommentText); | ||
next.remove(); | ||
} | ||
} | ||
|
||
class TranscludingComponentFactory implements ComponentFactory { | ||
final Expando _expando; | ||
|
||
TranscludingComponentFactory(this._expando); | ||
|
||
FactoryFn call(dom.Node node, DirectiveRef ref) { | ||
// CSS is not supported. | ||
assert((ref.annotation as Component).cssUrls == null || | ||
(ref.annotation as Component).cssUrls.isEmpty); | ||
|
||
var element = node as dom.Element; | ||
return (Injector injector) { | ||
var childInjector; | ||
var component = ref.annotation as Component; | ||
Scope scope = injector.get(Scope); | ||
ViewCache viewCache = injector.get(ViewCache); | ||
Http http = injector.get(Http); | ||
TemplateCache templateCache = injector.get(TemplateCache); | ||
DirectiveMap directives = injector.get(DirectiveMap); | ||
NgBaseCss baseCss = injector.get(NgBaseCss); | ||
|
||
var contentPort = new ContentPort(element); | ||
|
||
// Append the component's template as children | ||
var viewFuture = ComponentFactory._viewFuture(component, viewCache, directives); | ||
|
||
if (viewFuture != null) { | ||
viewFuture = viewFuture.then((ViewFactory viewFactory) { | ||
contentPort.pullNodes(); | ||
element.nodes.addAll(viewFactory(childInjector).nodes); | ||
return element; | ||
}); | ||
} else { | ||
viewFuture = new async.Future.microtask(() => contentPort.pullNodes()); | ||
} | ||
TemplateLoader templateLoader = new TemplateLoader(viewFuture); | ||
|
||
Scope shadowScope = scope.createChild({}); | ||
|
||
var probe; | ||
var childModule = new Module() | ||
..type(ref.type) | ||
..type(NgElement) | ||
..value(ContentPort, contentPort) | ||
..value(Scope, shadowScope) | ||
..value(TemplateLoader, templateLoader) | ||
..value(dom.ShadowRoot, new ShadowlessShadowRoot(element)) | ||
..factory(ElementProbe, (_) => probe); | ||
childInjector = injector.createChild([childModule], name: SHADOW_DOM_INJECTOR_NAME); | ||
|
||
var controller = childInjector.get(ref.type); | ||
shadowScope.context[component.publishAs] = controller; | ||
ComponentFactory._setupOnShadowDomAttach(controller, templateLoader, shadowScope); | ||
This comment has been minimized.
Sorry, something went wrong. |
||
return controller; | ||
}; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,3 +35,5 @@ class NgTemplate { | |
? (element as dom.TemplateElement).content.innerHtml | ||
: element.innerHtml)); | ||
} | ||
|
||
|
6 comments
on commit 26ad880
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While launching my application , I've got the following error :
'package:angular/core_dom/transcluding_component_factory.dart': Failed assertion: line 72 pos 12: '(ref.annotation as Component).cssUrls == null ||
(ref.annotation as Component).cssUrls.isEmpty' is not true.
STACKTRACE:
#0 TranscludingComponentFactory.call (package:angular/core_dom/transcluding_component_factory.dart:72:12)
#1 ElementBinder._createDirectiveFactories (package:angular/core_dom/element_binder.dart:239:48)
#2 ElementBinder.bind. (package:angular/core_dom/element_binder.dart:282:34)
#3 List.forEach (dart:core-patch/growable_array.dart:240)
....
The TranscludingComponentFactory call function ensure that the CSS is null or empty.
Does it mean that we can't define a cssUrl for a Component anymore ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this related to shadow-DOM-less?
I thought this is what shadow-DOM-less is all about, that you don't have encapsulation and the page CSS applies to its content.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
exactly , it is when I specify the option useShadowDom.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bwnyasse from your stack trace, the error is in "TranscludingComponentFactory".
May be you can put a small example in a gist ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bwnyasse Adding a cssUrl to a shadow DOM-less component is not allowed since we are not doing any style encapsulation with these components.
Style encapsulation will be implemented in the future; at this point we are collecting use-cases to understand how much of the shadow DOM spec we need to mimic.
Does your app behave as you want it to by moving all your CSS into document.head? Or do you need something else?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jbdeboer Thank you for the answer. I've moved all my CSS file into document.head and everything is ok right now.
@jbdeboer Does this make sense for transcluding cmp ?