【问题标题】:renderWith output visible in console, but does not update browserrenderWith 输出在控制台中可见,但不更新浏览器
【发布时间】:2016-11-30 13:27:28
【问题描述】:

我无法让我的控制器在浏览器中正确呈现 AJAX 请求的结果。我使用为 Ajax 请求指定的 Include 收到正确的 html 响应,但它仅在我的浏览器控制台中可见。页面本身不会呈现新内容。我错过了什么?

这是我用于搜索产品的简化控制器:

class ProductSearch_Controller extends Page_Controller {
  public function index(SS_HTTPRequest $request) {

    // external api request, parsing response, returning as ArrayList $units

    $return_data = array(
      'Products' => $units
    );

    if($request->isAjax()) {
      return $this->customise($return_data)->renderWith('SearchResults');
    } else {
      return $return_data;
    }
  }
}

index 方法实际上是从外部源中提取 json 数据,对其进行解析,然后将其传递到 ArrayList $units,然后以 Products 的形式提供给模板。这是简化的 ProductSearch.ss 模板:

<section>
  <div class="container">
    <div class="productsearch__container">
      <aside>$SearchForm</aside>
      <main>
        <h2>Search Results</h2>
        <% include SearchResults %>
      </main>
    </div>
  </div>
</section>

这是 SearchResults 模板,包括:

<div class="product__container">
    <% loop $Products %>
      <a href="$URL" class="product">
        <h3>Unit $UnitNo</h3>
        <ul>
          <li>Price: $Lot_Price</li>
          <li>SQFT: $SQFT</li>
          <li>Bedrooms: $bedrooms_no</li>
          <li>Baths: $baths_no</li>
        </ul>
      </a>
    <% end_loop %>
</div>

这是我的简化 javascript:

$("[name='example-filter-variable']").on('change', function(e) {
  e.preventDefault();
  var params = $( "#Form_SearchForm" ).serialize();
  $.get("url/example?" + params, function(data) {
    console.log("Data: " + data);
  });
});

触发 ajax 事件使用 SearchResults.ss 包含返回适当的响应,这在我的 console.log() 输出中可见:

<div class="product__container">
      <a href="/homes/search/show/6/101" class="product">
        <h3>Unit 101</h3>
        <ul>
          <li>Price: </li>
          <li>SQFT: 1531</li>
          <li>Bedrooms: 2</li>
          <li>Baths: 2</li>
        </ul>
      </a>

      <a href="/homes/search/show/12/102" class="product">
        <h3>Unit 102</h3>
        <ul>
          <li>Price: </li>
          <li>SQFT: 1535</li>
          <li>Bedrooms: 2</li>
          <li>Baths: 2</li>
        </ul>
      </a>

    ... and so on

</div>

问题是模板实际上是在浏览器中呈现的。我做错了吗?

【问题讨论】:

    标签: javascript php jquery ajax silverstripe


    【解决方案1】:

    模板中的这一行:&lt;% include SearchResults %&gt; 导致您的模板包含 SearchResults 模板。

    您的 javascript 中也没有任何东西可以将您的数据附加到 DOM 中。

    试试这个模板:

    <section>
      <div class="container">
        <div class="productsearch__container">
          <aside>$SearchForm</aside>
          <main>
            <h2>Search Results</h2>
            <div class="results"></div>
          </main>
        </div>
      </div>
    </section>
    

    有了这个js:

    $("[name='example-filter-variable']").on('change', function(e) {
      e.preventDefault();
      var params = $( "#Form_SearchForm" ).serialize();
      $.get("url/example?" + params, function(data) {
        console.log("Data: " + data);
        $(".results").append(data); // add something along these lines
      });
    });
    

    【讨论】:

    • 当然!这个问题与我的模板关系不大,而与我只是忘记将响应追加到 DOM 中的事实有关。谢谢!
    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-12-31
    • 2021-12-13
    • 2023-03-17
    • 2019-08-29
    • 2014-01-29
    相关资源
    最近更新 更多