lit-element: how to efficiently share a property from parent to child custom element The 2019 Stack Overflow Developer Survey Results Are InHow to efficiently count the number of keys/properties of an object in JavaScript?How do I remove a property from a JavaScript object?How do I remove a particular element from an array in JavaScript?How to toggle properties using an ASP.NET checkbox and javascript?Call child method from parentUpdate parent component property from child component in Angular 2Data not propagated from parent to child componentHow exactly works this Angular 5 example handling comunication between a parent and child component?Lit-Element doesn't let me set property value in htmlHow to set/override Lit-Element typescript property decorator by parsing value in index.html custom element?
aging parents with no investments
Is bread bad for ducks?
How long do I have to send payment?
What do hard-Brexiteers want with respect to the Irish border?
JSON.serialize: is it possible to suppress null values of a map?
Inflated grade on resume at previous job, might former employer tell new employer?
Is domain driven design an anti-SQL pattern?
Why don't Unix/Linux systems traverse through directories until they find the required version of a linked library?
Is "plugging out" electronic devices an American expression?
How to manage monthly salary
If Wish Duplicates Simulacrum, Are Existing Duplicates Destroyed?
Evaluating number of iteration with a certain map with While
It's possible to achieve negative score?
Where to refill my bottle in India?
Deadlock Graph and Interpretation, solution to avoid
What does "rabbited" mean/imply in this sentence?
Manuscript was "unsubmitted" because the manuscript was deposited in Arxiv Preprints
On the insanity of kings as an argument against Monarchy
Does a dangling wire really electrocute me if I'm standing in water?
Access elements in std::string where positon of string is greater than its size
Seven sins, seven Wizards, seven symbols, seven times repeated, but six super-heroes
Should I use my personal or workplace e-mail when registering to external websites for work purpose?
What could be the right powersource for 15 seconds lifespan disposable giant chainsaw?
How can I fix this gap between bookcases I made?
lit-element: how to efficiently share a property from parent to child custom element
The 2019 Stack Overflow Developer Survey Results Are InHow to efficiently count the number of keys/properties of an object in JavaScript?How do I remove a property from a JavaScript object?How do I remove a particular element from an array in JavaScript?How to toggle properties using an ASP.NET checkbox and javascript?Call child method from parentUpdate parent component property from child component in Angular 2Data not propagated from parent to child componentHow exactly works this Angular 5 example handling comunication between a parent and child component?Lit-Element doesn't let me set property value in htmlHow to set/override Lit-Element typescript property decorator by parsing value in index.html custom element?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Question: Is there a way to propagate a property change to a child element without triggering its render function? Currently when I update the property in parent's switchViewModeHandler it triggers a re-render on the child.
Use-case: toggling the parent into 'edit' mode should toggle the same for all of its children as well.
Doubt: Should I use custom events? Problem is that it will be a complex network of nested elements, with events it will become unwieldy to debug pretty quickly (already ran into this issue with Polymer).
Setup: Parent element:
class ParentElement extends LitElement
@property() viewMode;
constructor()
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
private switchViewModeHandler(event: MouseEvent): void
this.viewMode =
(this.viewMode === ViewMode.editing) ? ViewMode.editable : ViewMode.editing; // update my own edit mode
const options: HTMLElement[] = (Array.from(this.children) as HTMLElement[]);
options.forEach((item: HTMLElement) =>
item.viewMode = this.viewMode;
);
render()
return html`
<p>parent</p><label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked="$this.viewMode === ViewMode.editing"
@click="$
(event: MouseEvent): void => this.switchViewModeHandler(event)
"
/>
</label>
<slot></slot><!-- child comes from here -->
`;
Child element:
class ChildElement extends LitElement
@property() viewMode;
constructor()
super();
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
render()
console.log('child render() called');
return html`
<div class="viewer">child viewer</div>
<div class="editor mode-$this.viewMode">child editor</div>
`;
Markup:
<parent-element>
<child-element data-type="special"></child-element
></parent-element>
Edit mode comes from a simple enum that's imported (omitted here):
export enum ViewMode
readOnly = 'readOnly',
editable = 'editable',
editing = 'editing',
Here's a Codesandbox to play with: https://codesandbox.io/s/v1988qmn75
javascript typescript lit-element lit-html
add a comment |
Question: Is there a way to propagate a property change to a child element without triggering its render function? Currently when I update the property in parent's switchViewModeHandler it triggers a re-render on the child.
Use-case: toggling the parent into 'edit' mode should toggle the same for all of its children as well.
Doubt: Should I use custom events? Problem is that it will be a complex network of nested elements, with events it will become unwieldy to debug pretty quickly (already ran into this issue with Polymer).
Setup: Parent element:
class ParentElement extends LitElement
@property() viewMode;
constructor()
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
private switchViewModeHandler(event: MouseEvent): void
this.viewMode =
(this.viewMode === ViewMode.editing) ? ViewMode.editable : ViewMode.editing; // update my own edit mode
const options: HTMLElement[] = (Array.from(this.children) as HTMLElement[]);
options.forEach((item: HTMLElement) =>
item.viewMode = this.viewMode;
);
render()
return html`
<p>parent</p><label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked="$this.viewMode === ViewMode.editing"
@click="$
(event: MouseEvent): void => this.switchViewModeHandler(event)
"
/>
</label>
<slot></slot><!-- child comes from here -->
`;
Child element:
class ChildElement extends LitElement
@property() viewMode;
constructor()
super();
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
render()
console.log('child render() called');
return html`
<div class="viewer">child viewer</div>
<div class="editor mode-$this.viewMode">child editor</div>
`;
Markup:
<parent-element>
<child-element data-type="special"></child-element
></parent-element>
Edit mode comes from a simple enum that's imported (omitted here):
export enum ViewMode
readOnly = 'readOnly',
editable = 'editable',
editing = 'editing',
Here's a Codesandbox to play with: https://codesandbox.io/s/v1988qmn75
javascript typescript lit-element lit-html
add a comment |
Question: Is there a way to propagate a property change to a child element without triggering its render function? Currently when I update the property in parent's switchViewModeHandler it triggers a re-render on the child.
Use-case: toggling the parent into 'edit' mode should toggle the same for all of its children as well.
Doubt: Should I use custom events? Problem is that it will be a complex network of nested elements, with events it will become unwieldy to debug pretty quickly (already ran into this issue with Polymer).
Setup: Parent element:
class ParentElement extends LitElement
@property() viewMode;
constructor()
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
private switchViewModeHandler(event: MouseEvent): void
this.viewMode =
(this.viewMode === ViewMode.editing) ? ViewMode.editable : ViewMode.editing; // update my own edit mode
const options: HTMLElement[] = (Array.from(this.children) as HTMLElement[]);
options.forEach((item: HTMLElement) =>
item.viewMode = this.viewMode;
);
render()
return html`
<p>parent</p><label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked="$this.viewMode === ViewMode.editing"
@click="$
(event: MouseEvent): void => this.switchViewModeHandler(event)
"
/>
</label>
<slot></slot><!-- child comes from here -->
`;
Child element:
class ChildElement extends LitElement
@property() viewMode;
constructor()
super();
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
render()
console.log('child render() called');
return html`
<div class="viewer">child viewer</div>
<div class="editor mode-$this.viewMode">child editor</div>
`;
Markup:
<parent-element>
<child-element data-type="special"></child-element
></parent-element>
Edit mode comes from a simple enum that's imported (omitted here):
export enum ViewMode
readOnly = 'readOnly',
editable = 'editable',
editing = 'editing',
Here's a Codesandbox to play with: https://codesandbox.io/s/v1988qmn75
javascript typescript lit-element lit-html
Question: Is there a way to propagate a property change to a child element without triggering its render function? Currently when I update the property in parent's switchViewModeHandler it triggers a re-render on the child.
Use-case: toggling the parent into 'edit' mode should toggle the same for all of its children as well.
Doubt: Should I use custom events? Problem is that it will be a complex network of nested elements, with events it will become unwieldy to debug pretty quickly (already ran into this issue with Polymer).
Setup: Parent element:
class ParentElement extends LitElement
@property() viewMode;
constructor()
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
private switchViewModeHandler(event: MouseEvent): void
this.viewMode =
(this.viewMode === ViewMode.editing) ? ViewMode.editable : ViewMode.editing; // update my own edit mode
const options: HTMLElement[] = (Array.from(this.children) as HTMLElement[]);
options.forEach((item: HTMLElement) =>
item.viewMode = this.viewMode;
);
render()
return html`
<p>parent</p><label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked="$this.viewMode === ViewMode.editing"
@click="$
(event: MouseEvent): void => this.switchViewModeHandler(event)
"
/>
</label>
<slot></slot><!-- child comes from here -->
`;
Child element:
class ChildElement extends LitElement
@property() viewMode;
constructor()
super();
this.viewMode = ViewMode.editable;
static get properties()
return
viewMode: type: String, reflect: true ,
;
render()
console.log('child render() called');
return html`
<div class="viewer">child viewer</div>
<div class="editor mode-$this.viewMode">child editor</div>
`;
Markup:
<parent-element>
<child-element data-type="special"></child-element
></parent-element>
Edit mode comes from a simple enum that's imported (omitted here):
export enum ViewMode
readOnly = 'readOnly',
editable = 'editable',
editing = 'editing',
Here's a Codesandbox to play with: https://codesandbox.io/s/v1988qmn75
javascript typescript lit-element lit-html
javascript typescript lit-element lit-html
asked Mar 14 at 21:22
montrealistmontrealist
3,07183953
3,07183953
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Propagating state to light DOM children is a relatively rarely needed pattern, so we don't have it documented well yet, but there are some cases like yours where it's necessary.
The right approach really depends on how controlled the children of the container element are. If you, the author of the parent element, also are the only user of it, and so know exactly what the children can be, then you have some more flexibility.
Options I can think of are:
- Always set a property on the child, regardless of type. This is like if you had a
<child prop=$x></child>syntax available in lit-html. - Fire an event on the children. This is very decoupled, but more cost for little benefit if you don't have children from third parties.
- Have children register with the parent. More responsibility on the child, but takes advantage of the child's lifecycles to subscribe to state changes.
I'd say your approach to set child state in an event handler isn't far off, except that it's too tied to the user interaction event and not the state itself.
I'd go for something where you always update state in updated():
class ParentElement extends LitElement
@property( type: String, reflect: true )
viewMode = ViewMode.editable;
private _onSwitchClicked(event: MouseEvent): void
this.viewMode = (this.viewMode === ViewMode.editing)
? ViewMode.editable
: ViewMode.editing;
private _onSlotChange()
this.requestUpdate();
updated()
for (const child of Array.from(this.children))
child.viewMode = this.viewMode;
render()
return html`
<p>parent</p>
<label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked=$this.viewMode === ViewMode.editing
@click=$this._onSwitchClicked>
</label>
<slot @slotchange=$this._onSlotChange></slot>
`;
If the children are LitElements and the values are primitives, it's ok to always set the properties - they'll be dirty checked in the children.
Note the slotchange event handler on <slot> so we can observe the children.
I also cleaned up a few other things in your example: - Local event handlers using@don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.
– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55172223%2flit-element-how-to-efficiently-share-a-property-from-parent-to-child-custom-ele%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Propagating state to light DOM children is a relatively rarely needed pattern, so we don't have it documented well yet, but there are some cases like yours where it's necessary.
The right approach really depends on how controlled the children of the container element are. If you, the author of the parent element, also are the only user of it, and so know exactly what the children can be, then you have some more flexibility.
Options I can think of are:
- Always set a property on the child, regardless of type. This is like if you had a
<child prop=$x></child>syntax available in lit-html. - Fire an event on the children. This is very decoupled, but more cost for little benefit if you don't have children from third parties.
- Have children register with the parent. More responsibility on the child, but takes advantage of the child's lifecycles to subscribe to state changes.
I'd say your approach to set child state in an event handler isn't far off, except that it's too tied to the user interaction event and not the state itself.
I'd go for something where you always update state in updated():
class ParentElement extends LitElement
@property( type: String, reflect: true )
viewMode = ViewMode.editable;
private _onSwitchClicked(event: MouseEvent): void
this.viewMode = (this.viewMode === ViewMode.editing)
? ViewMode.editable
: ViewMode.editing;
private _onSlotChange()
this.requestUpdate();
updated()
for (const child of Array.from(this.children))
child.viewMode = this.viewMode;
render()
return html`
<p>parent</p>
<label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked=$this.viewMode === ViewMode.editing
@click=$this._onSwitchClicked>
</label>
<slot @slotchange=$this._onSlotChange></slot>
`;
If the children are LitElements and the values are primitives, it's ok to always set the properties - they'll be dirty checked in the children.
Note the slotchange event handler on <slot> so we can observe the children.
I also cleaned up a few other things in your example: - Local event handlers using@don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.
– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
add a comment |
Propagating state to light DOM children is a relatively rarely needed pattern, so we don't have it documented well yet, but there are some cases like yours where it's necessary.
The right approach really depends on how controlled the children of the container element are. If you, the author of the parent element, also are the only user of it, and so know exactly what the children can be, then you have some more flexibility.
Options I can think of are:
- Always set a property on the child, regardless of type. This is like if you had a
<child prop=$x></child>syntax available in lit-html. - Fire an event on the children. This is very decoupled, but more cost for little benefit if you don't have children from third parties.
- Have children register with the parent. More responsibility on the child, but takes advantage of the child's lifecycles to subscribe to state changes.
I'd say your approach to set child state in an event handler isn't far off, except that it's too tied to the user interaction event and not the state itself.
I'd go for something where you always update state in updated():
class ParentElement extends LitElement
@property( type: String, reflect: true )
viewMode = ViewMode.editable;
private _onSwitchClicked(event: MouseEvent): void
this.viewMode = (this.viewMode === ViewMode.editing)
? ViewMode.editable
: ViewMode.editing;
private _onSlotChange()
this.requestUpdate();
updated()
for (const child of Array.from(this.children))
child.viewMode = this.viewMode;
render()
return html`
<p>parent</p>
<label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked=$this.viewMode === ViewMode.editing
@click=$this._onSwitchClicked>
</label>
<slot @slotchange=$this._onSlotChange></slot>
`;
If the children are LitElements and the values are primitives, it's ok to always set the properties - they'll be dirty checked in the children.
Note the slotchange event handler on <slot> so we can observe the children.
I also cleaned up a few other things in your example: - Local event handlers using@don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.
– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
add a comment |
Propagating state to light DOM children is a relatively rarely needed pattern, so we don't have it documented well yet, but there are some cases like yours where it's necessary.
The right approach really depends on how controlled the children of the container element are. If you, the author of the parent element, also are the only user of it, and so know exactly what the children can be, then you have some more flexibility.
Options I can think of are:
- Always set a property on the child, regardless of type. This is like if you had a
<child prop=$x></child>syntax available in lit-html. - Fire an event on the children. This is very decoupled, but more cost for little benefit if you don't have children from third parties.
- Have children register with the parent. More responsibility on the child, but takes advantage of the child's lifecycles to subscribe to state changes.
I'd say your approach to set child state in an event handler isn't far off, except that it's too tied to the user interaction event and not the state itself.
I'd go for something where you always update state in updated():
class ParentElement extends LitElement
@property( type: String, reflect: true )
viewMode = ViewMode.editable;
private _onSwitchClicked(event: MouseEvent): void
this.viewMode = (this.viewMode === ViewMode.editing)
? ViewMode.editable
: ViewMode.editing;
private _onSlotChange()
this.requestUpdate();
updated()
for (const child of Array.from(this.children))
child.viewMode = this.viewMode;
render()
return html`
<p>parent</p>
<label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked=$this.viewMode === ViewMode.editing
@click=$this._onSwitchClicked>
</label>
<slot @slotchange=$this._onSlotChange></slot>
`;
If the children are LitElements and the values are primitives, it's ok to always set the properties - they'll be dirty checked in the children.
Note the slotchange event handler on <slot> so we can observe the children.
Propagating state to light DOM children is a relatively rarely needed pattern, so we don't have it documented well yet, but there are some cases like yours where it's necessary.
The right approach really depends on how controlled the children of the container element are. If you, the author of the parent element, also are the only user of it, and so know exactly what the children can be, then you have some more flexibility.
Options I can think of are:
- Always set a property on the child, regardless of type. This is like if you had a
<child prop=$x></child>syntax available in lit-html. - Fire an event on the children. This is very decoupled, but more cost for little benefit if you don't have children from third parties.
- Have children register with the parent. More responsibility on the child, but takes advantage of the child's lifecycles to subscribe to state changes.
I'd say your approach to set child state in an event handler isn't far off, except that it's too tied to the user interaction event and not the state itself.
I'd go for something where you always update state in updated():
class ParentElement extends LitElement
@property( type: String, reflect: true )
viewMode = ViewMode.editable;
private _onSwitchClicked(event: MouseEvent): void
this.viewMode = (this.viewMode === ViewMode.editing)
? ViewMode.editable
: ViewMode.editing;
private _onSlotChange()
this.requestUpdate();
updated()
for (const child of Array.from(this.children))
child.viewMode = this.viewMode;
render()
return html`
<p>parent</p>
<label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked=$this.viewMode === ViewMode.editing
@click=$this._onSwitchClicked>
</label>
<slot @slotchange=$this._onSlotChange></slot>
`;
If the children are LitElements and the values are primitives, it's ok to always set the properties - they'll be dirty checked in the children.
Note the slotchange event handler on <slot> so we can observe the children.
edited Mar 22 at 2:33
answered Mar 17 at 23:16
Justin FagnaniJustin Fagnani
5,2501127
5,2501127
I also cleaned up a few other things in your example: - Local event handlers using@don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.
– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
add a comment |
I also cleaned up a few other things in your example: - Local event handlers using@don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.
– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
I also cleaned up a few other things in your example: - Local event handlers using
@ don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.– Justin Fagnani
Mar 17 at 23:17
I also cleaned up a few other things in your example: - Local event handlers using
@ don't need to be bound or arrow functions. Method work fine and have slightly lower costs. - You don't need quotes around bindings, unless it's an interpolation. - You can declare property options in the decorator. - You can initialize a field in its declaration, you don't need a constructor.– Justin Fagnani
Mar 17 at 23:17
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
excellent answer, thank you for taking such thorough look!
– montrealist
Mar 19 at 21:21
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55172223%2flit-element-how-to-efficiently-share-a-property-from-parent-to-child-custom-ele%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown