获取 XHPChild 的 children
Get children of an XHPChild
当然,我正在尝试将我的网站移动到 Hack 和 XHP。下面是我想要实现的代码结构的结构:
<ui:backstageHeader>
<ui:backstageHeader-navItem href="/">stories</ui:backstageHeader-navItem>
<ui:backstageHeader-navItem href="/story/send">send a story</ui:backstageHeader-navItem>
<ui:backstageHeader-navItem href="/aboutus">support</ui:backstageHeader-navItem>
</ui:backstageHeader>
(注: :ui:backstageHeader-navItem
基本上呈现为 <a href={$this->:href}>{$this->getCHildren}</a>
所以不需要在此处附加其 class。)
下面是 :ui:backstageHeader
的代码:
final class :ui:backstageHeader extends :ui:base {
attribute :div;
children (:ui:backstageHeader-navItem)*;
protected function compose() {
$dom =
<section class="backstage-header">
<div class="container">
<div class="cell-logo">
<a href="/">
<span class="no23-logo-white"></span>
</a>
</div>
<div class="cell-navigation">
</div>
<div class="cell-account">
<div class="cell-login">
<div id="siteNav-login">Autentificare</div>
</div>
</div>
</div>
</section>;
$mainContainer = $dom->getChildren("div")[0];
$cellNavigation = $mainContainer->getChildren("div")[1];
$navItems = <ul class="main-navigation"></ul>;
foreach($this->getChildren() as $child) {
$navItems->appendChild(<li>{$child}</li>);
}
$dom->appendChild($navItems);
return $dom;
}
}
我使用终端使用 hhvm -m d <file.php>
调试我的代码,一切正常;但是,当我进入浏览器时,我收到 500
错误 header。日志是这样写的:
Catchable fatal error: Hack type error: Could not find method getChildren in an object of type XHPChild at /var/www/res/ui/backstage-header.php line 25
错误来自
$cellNavigation = $mainContainer->getChildren("div")[1];
但是,不知何故,我需要将 ul.main-navigation
从我的 section.backstage-header
附加到 div.cell-navigation
。
我该怎么做?
根据我的经验,appendChild 很容易出现人为错误。这样做更容易:
$items = (new Vector($this->getChildren()))->map($child ==> <li>{$child}</li>);
return <div id="container">{$items}</div>;
如果您想将 children 包装在 <li />
中。
不确定这是否可行,但它会很接近。
不要以这种方式构建代码。从内到外构建它,这样您就不必执行大量无法读取的 getChildren
调用来寻找特定的子项。当您更改 XHP 的结构时,这些调用非常难以阅读,而且非常不灵活。你不会在 JS DOM 中做类似 node.firstChild.lastChild.lastChild.firstChild
的事情吧?不,在JS中有更好的方法,通过class或ID来查找东西;在 XHP 中,您可以首先以正确的方式构建它!
我会给你一个这样的例子,但看起来你实际上并没有使用$mainContainer
或$cellNavigation
,所以你可以只需删除这两个有问题的定义即可。
顺便说一句,你真的不应该把你的类型错误当作来自 HHVM 的致命错误;这是不得已的检查。直接尝试 运行 hh_client
检查器,甚至可能在您的 IDE 中显示其结果;它将为您提供更快的迭代周期,以及比 HHVM 提供的更多信息。
专业提示:您可以从 XHP 树中分配变量。
$root =
<div>
{$child = <span>
Text children
</span>}
</div>;
现在 $child 已经设置为 <span>
元素。
当然,我正在尝试将我的网站移动到 Hack 和 XHP。下面是我想要实现的代码结构的结构:
<ui:backstageHeader>
<ui:backstageHeader-navItem href="/">stories</ui:backstageHeader-navItem>
<ui:backstageHeader-navItem href="/story/send">send a story</ui:backstageHeader-navItem>
<ui:backstageHeader-navItem href="/aboutus">support</ui:backstageHeader-navItem>
</ui:backstageHeader>
(注: :ui:backstageHeader-navItem
基本上呈现为 <a href={$this->:href}>{$this->getCHildren}</a>
所以不需要在此处附加其 class。)
下面是 :ui:backstageHeader
的代码:
final class :ui:backstageHeader extends :ui:base {
attribute :div;
children (:ui:backstageHeader-navItem)*;
protected function compose() {
$dom =
<section class="backstage-header">
<div class="container">
<div class="cell-logo">
<a href="/">
<span class="no23-logo-white"></span>
</a>
</div>
<div class="cell-navigation">
</div>
<div class="cell-account">
<div class="cell-login">
<div id="siteNav-login">Autentificare</div>
</div>
</div>
</div>
</section>;
$mainContainer = $dom->getChildren("div")[0];
$cellNavigation = $mainContainer->getChildren("div")[1];
$navItems = <ul class="main-navigation"></ul>;
foreach($this->getChildren() as $child) {
$navItems->appendChild(<li>{$child}</li>);
}
$dom->appendChild($navItems);
return $dom;
}
}
我使用终端使用 hhvm -m d <file.php>
调试我的代码,一切正常;但是,当我进入浏览器时,我收到 500
错误 header。日志是这样写的:
Catchable fatal error: Hack type error: Could not find method getChildren in an object of type XHPChild at /var/www/res/ui/backstage-header.php line 25
错误来自
$cellNavigation = $mainContainer->getChildren("div")[1];
但是,不知何故,我需要将 ul.main-navigation
从我的 section.backstage-header
附加到 div.cell-navigation
。
我该怎么做?
根据我的经验,appendChild 很容易出现人为错误。这样做更容易:
$items = (new Vector($this->getChildren()))->map($child ==> <li>{$child}</li>);
return <div id="container">{$items}</div>;
如果您想将 children 包装在 <li />
中。
不确定这是否可行,但它会很接近。
不要以这种方式构建代码。从内到外构建它,这样您就不必执行大量无法读取的 getChildren
调用来寻找特定的子项。当您更改 XHP 的结构时,这些调用非常难以阅读,而且非常不灵活。你不会在 JS DOM 中做类似 node.firstChild.lastChild.lastChild.firstChild
的事情吧?不,在JS中有更好的方法,通过class或ID来查找东西;在 XHP 中,您可以首先以正确的方式构建它!
我会给你一个这样的例子,但看起来你实际上并没有使用$mainContainer
或$cellNavigation
,所以你可以只需删除这两个有问题的定义即可。
顺便说一句,你真的不应该把你的类型错误当作来自 HHVM 的致命错误;这是不得已的检查。直接尝试 运行 hh_client
检查器,甚至可能在您的 IDE 中显示其结果;它将为您提供更快的迭代周期,以及比 HHVM 提供的更多信息。
专业提示:您可以从 XHP 树中分配变量。
$root =
<div>
{$child = <span>
Text children
</span>}
</div>;
现在 $child 已经设置为 <span>
元素。