【发布时间】:2016-05-05 12:53:02
【问题描述】:
各位开发者好,
我们必须用 AngularJS 在 Symfony2 中重写一个软件应用程序,我们使用 Symfony2 来实现 MVC 目的,而 AngularJS 来实现有用的功能。
这是我们的问题,我们首先在我的 Symfony2 视图中使用 AngularJS 将以下代码显示在表格中:
var app = angular.module('appName', []);
app.controller('clientsCtrl', function ($scope, $http){
$scope.loading = true;
$http.post('{{ url(generatedScope) }}').then(function(response){
$scope.clients = response.data;
$scope.order = function(predicate){
$scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse :false;
$scope.predicate = predicate;
}
},function(response){
// TODO: handle the error somehow
})
});
{{ url(generatedScope) }} 是 Symfony2 控制器发送的 Twig var,其内容如下:
/**
* @Route("/clients", name="index")
*/
public function indexAction(Request $request)
{
$form = $this->createForm(SearchClients::class, null);
$form->handleRequest($request);
if($form->isValid()){
//TODO: Get form params and update angularJS scope somehow
}
return $this->render('clients/list.html.twig', [
'generatedScope' => 'getClients',
'form' => $form->createView()
]);
}
getClients是我们打开视图时默认路由的名称clients/list.html.twig(我们没有使用Doctrine):
/**
* @Route("/clients/list/json", name="getClients")
*/
public function getClientsAction()
{
$clients = new Clients($this->get('database_connection'));
$response = new JsonResponse($clients->getClients());
return $response;
}
所以基本上我们的控制器发送的generatedScope 是:127.0.0.0:8000/clients/list/json,这是我们客户的 json 集合,然后我们以这种方式在表中显示客户:
<tr ng-repeat="x in clients | filter : test | orderBy:predicate:reverse">
<td>#{{ x.cli_id }}</td>
<td>{{ x.cli_lastname }}</td>
<td>{{ x.cli_firstname }}</td>
</tr>
我们有一个搜索表单,与显示客户的表格相同的页面,我们收集名字和姓氏并调用一个操作来检索 json 响应以更新我们的角度范围,我们设法以这种方式检索响应:
/**
* @Route("/tiers/list/json/search", name="searchClients")
*/
public function searchClientsAction(){
$request = new Request($_POST);
$request = $request->query->get('search_clients'); //form name
$clients = new clients($this->get('database_connection'));
$response = new JsonResponse($clients->searchClients($request));
return $response;
}
在验证了indexAction 中的表单后,我们尝试通过此路由发送视图:
if($form->isValid()){
//TODO: Get form params and update angularJS scope somehow
return $this->render('clients/list.html.twig', [
'generatedScope' => 'searchClients',
'form' => $form->createView()
]);
}
但正如你所见,它不起作用。
那么,我们如何在验证 Symfony2 表单后更新 angularJS 范围?
如果有人遇到这个问题...很高兴阅读他的意见!
最好的问候,
迪伦
【问题讨论】:
-
in
searchClientsAction为什么要创建Request的新实例?只需使用Request $request输入提示操作,它将由 symfony 填充。除非我误解了您的代码,否则这可能是问题所在? -
从您的措辞来看,我不确定您是否提交了表单。如果您要同步发布表单,那么“{{ url(generatedScope) }}”应该包含“searchClients”路由,但您没有传递数据属性特别是“search_clients”,其中“searchClientsAction”需要查询。另一方面,如果您异步发布,即使发布请求包含所有必要的表单发布数据,它也应该返回 Twig 生成的 html(来自索引页面但具有不同的 generateScope 变量)
-
如果您可以使用 if($form->isValid()) 子句,您可以复制整个“searchClientsAction”功能内容(我不推荐)。在我们将 angularjs 添加到 symfony 后端之后,我们停止使用表单并开始使用后端作为 rest api。然后在您按下搜索按钮后,您将使用 'search_clients' 调用 $http 到 'searchClientsAction' 路由,并分配 $scope.clients = response.data;
-
@Kodvin 是对的,请查看我自己对该主题的回答。可以告诉我你对我的解决方案的看法,会很棒!谢谢大家:-)
标签: javascript php angularjs json symfony