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-navigationます。div.cell-navigationsection.backstage-header

どうすればいいですか?

4

3 に答える 3

1

このようにコードを構成しないでください。getChildren特定の子を探すために大量の読み取り不可能な呼び出しを行う必要がないように、裏返しに構築しました。これらの呼び出しは非常に読みにくく、XHP の構造を変更すると非常に柔軟性がなくなります。node.firstChild.lastChild.lastChild.firstChildJS DOM のようなことはしないでしょう。いいえ、JS には、クラスまたは ID で物事を見つけるためのより良い方法があります。XHP では、最初から正しい方法でビルドできます。

この例を挙げたいと思いますが、実際にorを使用 しているようには見えないので、これら 2 つの問題のある定義を削除するだけで済みます。$mainContainer$cellNavigation

余談ですが、HHVM からキャッチ可能な致命的なエラーとして型エラーを取得するべきではありません。これは最終手段のチェックです。チェッカーを直接実行してみてくださいhh_client。おそらく、その結果を IDE に表示することもできます。これにより、反復サイクルがはるかに高速になり、HHVM が提供するよりもはるかに多くの情報が得られます。

于 2015-08-15T15:34:39.223 に答える