0

当然,我正在尝试将我的网站移至 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>所以这里不需要附加它的类。)

下面是代码: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错误标题。这就是日志所说的:

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-navigationdiv.cell-navigation我的section.backstage-header.

我该怎么做?

4

3 回答 3

1

不要以这种方式构建您的代码。从内到外构建它,这样您就不必进行大量不可读的getChildren调用来寻找特定的孩子。当您更改 XHP 的结构时,这些调用非常难以阅读,并且非常不灵活。您不会node.firstChild.lastChild.lastChild.firstChild在 JS DOM 中做类似的事情,对吗?不,在 JS 中有更好的方法,可以通过类或 ID 来查找;在 XHP 中,您可以一开始就以正确的方式构建它!

我会给你一个例子,但它看起来不像你实际使用 $mainContaineror $cellNavigation,所以你可以删除这两个有问题的定义。

顺便说一句,你真的不应该把你的类型错误当作 HHVM 的可捕获的致命错误。这是最后的检查方式。尝试hh_client直接运行检查器,甚至可以在你的 IDE 中显示它的结果;它将为您提供更快的迭代周期,以及比 HHVM 提供的更多信息。

于 2015-08-15T15:34:39.223 回答
1

根据我的经验,appendChild 很容易出现人为错误。这样做更容易:

$items = (new Vector($this->getChildren()))->map($child ==> <li>{$child}</li>);
return <div id="container">{$items}</div>;

如果你想把孩子们包裹在<li />.

不确定这是否会起作用,但它会很接近。

于 2015-08-14T20:45:41.857 回答
0

专业提示:您可以从 XHP 树中分配变量。

$root =
  <div>
    {$child = <span>
      Text children
    </span>}
  </div>;

现在 $child 已经设置为<span>元素。

于 2015-12-31T07:10:21.430 回答