我不确定我的标题是否准确,所以我会尽力在此解释。是否有方法在不刷新页面的情况下动态更改Twig块中的内容?
我试图做的是用Ajax调用我的控制器,并让它在页面上更改内容而不重新加载(内容由块定义)。因此,对于一个松散的例子,在主页的到来,网页的内容是:
# routing.yml
StackQuestionBundle_osgs_home:
pattern:/
defaults: { _controller: StackQuestionBundle:Pages:index }
options:
expose: true
StackQuestionBundle_osgs_page:
pattern: /page
defaults: { _controller: StackQuestionBundle:Pages:page }
options:
expose: true
<!-- @StackQuestionBundle:Pages:index.html.twig -->
<header>
{% block title %} <!-- Title --> {% endblock %}
<nav> </nav>
</header>
<main>
<aside> <!-- Sidebar --> </aside>
<section>
{% block content %} <!-- Main Content -->{% endblock %}
</section>
</main>
<footer>
{% block footer %} <!-- content --> {% endblock %}
<nav> </nav>
</footer>
// JS
$('nav button.test').click(function() {
$.ajax({
url: "{{ path('OSGSBundle_osgs_page') }}",
type: "POST",
success: function(data) {
//Change the content in the blocks!
//alert("It worked!")
}
});
});
# PagesController.php
namespace MyNameSpace\StackQuestionBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class PagesController extends Controller
{
public function indexAction()
{
return $this->render('OSGSBundle:Pages:index.html.twig');
}
public function pageAction(Request $request)
{
$isAjax = $this->get('Request')->isXMLHttpRequest();
if ($isAjax)
{
// Replace/Append the content in index.html.twig with the content from page.html.twig
}
else
{
// Load page normally if navigated to http://localhost/page
return $this->render('OSGSBundle:Pages:page.html.twig');
}
}
}
这是我的目前的代码看起来像。到目前为止,我已经设法只根据DOM元素替换数据。所以,我会替换我的<main>
标签中的所有信息。我只想替换我的Twig块标记中的内容。附注:我使用FOSJSRoutingBundle来更改网址。
在此先感谢,我感谢帮助/建议。我希望这不是太混乱。
您正在构建一个Web应用程序(特点是,JavaScript中正在处理很多逻辑)?如果是这样的话,Twig可能不是这里最好的工具。 – 2013-03-13 22:31:15
@ tomas.pecserke实际上这里并没有很多逻辑正在被Javascript处理。它主要是为动画设置的。我认为Twig仍然是这个的正确选择。 – ABCaesar 2013-03-14 13:14:48