Comments (8)
In my example I thought we'd just mention the double-rendered element's name (Can't render because a child (<br>) was already rendered
) but the full path is nicer, I like that.
from xhp-lib.
I thought I had fixed that confusing error message in ac61647, but I guess not for nested cases. I'll see if there is a fix possible which generates such an error message, which doesn't have a heavy runtime cost.
from xhp-lib.
This may also require addressing in the migration guide, it seems that "Can't ... after render" errors are much more common in v4.
And yes, Can't X
after render is new in XHP-4.
from xhp-lib.
I've also noticed that these errors often pop up when you try to do something sketchy during rendering:
use XHPHTMLHelpers;
protected async function renderAsync(): Awaitable<x\node> {
$id = $this->getID();
// ...
}
will give you "Can't addAttribute after render" if ID wasn't set previously.
from xhp-lib.
I've also noticed that these errors often pop up when you try to do something sketchy during rendering:
use XHPHTMLHelpers; protected async function renderAsync(): Awaitable<x\node> { $id = $this->getID(); // ... }will give you "Can't addAttribute after render" if ID wasn't set previously.
That is because ->__isRendered = true
happens before ->renderAsync()
.
protected async function __renderAndProcess(): Awaitable<node> {
if ($this->__isRendered) {
throw new UseAfterRenderException(
'Attempted to render XHP element twice',
);
}
$this->__isRendered = true; // < needs to be moved from here
if (\Facebook\XHP\ChildValidation\is_enabled()) {
$this->validateChildren();
}
$composed = await $this->renderAsync();
// to here (1)
$composed->__transferContext($this->getAllContexts());
if ($this is HTML\HasXHPAttributeClobbering_DEPRECATED) {
$this->transferAttributesToRenderedRoot($composed);
}
// or here (2)
return $composed;
}
@fredemmott We want to allow modification during ->renderAsync()
, right?
from xhp-lib.
It would be better if it said something like Can't render because a child (<li>) was already rendered instead of Can't replaceChildren after render.
I can't quite match that, but this is already worlds better. #281
<div><ui:div><ui:div><span>{$br}</span></ui:div></ui:div></div>
// ^^^ rendered already
Attempted to render XHP element twice
Via XHPPath: HTML\\div -> ui\\div -> HTML\\div -> ui\\div -> HTML\\div -> HTML\\span -> HTML\\br.
XHPPath will only be included when a subnode throws during render.
If you are doing something to a node directly, the exception messages are unchanged.
from xhp-lib.
Fixed by #281
from xhp-lib.
Thanks!
from xhp-lib.
Related Issues (20)
- Remove XHPRoot, seal `x:node`/composable-element to x:primitive and x:element HOT 5
- [ Todo ] When XHP version 4 is released, update the docs about runtime validation in user-documentation. HOT 2
- Remove class2element/element2class
- Audit all code that is not in namespaces HOT 1
- Do we want the HTML xhp classes to be final in v4?
- [ RFC ] Introduce a new exception class for modifying/rendering xhp after initial render HOT 1
- Remove string selectors from getFirstChild and friends
- Audit missing category declarations HOT 4
- Rewrite docs on user-documentation to use xhp 4 syntax and rules HOT 2
- Make a full list of changes from v3
- Write a migration guide for v3 -> v4
- Review and consider removing all 'deprecated' features HOT 1
- Update README to reflect xhp-4
- hhvm 4.97 issue: x\node should permit ?XHPChild children HOT 2
- Class Undefined xhp-lib v3 HOT 9
- Use of XHP at Facebook HOT 2
- Default values of aria- and data- attributes are ignored
- [Request] Custom special attributes HOT 4
- Status of the project HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from xhp-lib.