2014-02-06 40 views
3

我有一個用Symfony2表單組件構建的簡單編輯表單。這意味着這個表單將填充我的php控制器中的模型數據。將Angular.js與Symfony 2一起使用

但每個表單輸入都關聯了一個ng-model指令。現在這裏是我面臨的問題:

在編輯窗體上輸入時,輸入是空的值(因爲它們未在角度控制器中初始化),但是如果我檢查與螢火蟲它們將具有值屬性用適當的數據設置(因爲數據是在php控制器中設置的)。

有沒有辦法初始化角模型?

+0

您是否使用Symfony生成html即樹枝? – Cerad

+0

是的,但這不應該是一個問題 – zuzuleinen

+0

我剛剛做了兩天前的類似的事情。你是否產生了認爲「AJAX」的表單?如果是這樣,事後您是否嘗試過運行'$ scope。$ apply'? (如果你使用Angular的'$ http',你不需要這個) –

回答

7

這不是直接回答這個問題,但使用AngularJS和Symfony的2(S2),而一些評論。

AngularJS真的想要控制您的瀏覽器並充當單頁應用程序。它希望服務器被動地提供模板,圖像等。它想通過json傳輸數據塊。

S2視圖組件真的想通過樹枝生成它自己的html。它基於一個愚蠢的瀏覽器,只能渲染髮送的內容(完整的html頁面)。

嫩枝是不是AngularJS模板,尤其是因爲它們都使用大括號了兼容。因爲它要控制的輸入元素命名爲允許映射發佈的數據返回到對象

的S2形式的HTML發生器增加了複雜性的附加層。 AngularJS想要使用它自己的表單元素和json。

我讓每個人都做它最擅長的事情。我只有一個S2樹枝模板,它是應用程序的主要入口點。該模板提供了獲取AngularJS所需的JavaScripts。

我然後讓AngularJS要求部分模板格式AngularJS希望看到他們的方式。 S2不會處理這些部分,也不會看到它們。

S2用於實現REST喜歡的web api。它提取數據並將其作爲json提供。 JMSSerializer包在這裏派上用場。 AngularJS控制器負責處理瀏覽器端的數據並將其映射到AngularJS表單。

拼圖的缺失部分是使用S2表單組件進行驗證。目前,我根本不使用表單組件。序列化程序幫助我將json數據映射到我的對象(替換$ form-> handleRequest功能),然後直接調用驗證器(替換formIsValid)。

雖然我有時會錯過表單組件,但它工作得很好。能夠輕鬆地重用表單類型是很好的。

我真的很想讓S2表單組件能夠直接處理json。這可能是可以做的。只需要更深入地挖掘它。

============================================== =

這裏是映射到AngularJS模型

<form name="form" novalidate class="simple-form css-form"> 
ID: {{ person.id }}<br /> 

Full Name: <input type="text" ng-model="person.name_full" name="person_name_full" required /><br /> 
<div ng-show="form.person_name_full.$dirty && form.person_name_full.$invalid">Invalid: 
    <span ng-show="form.person_name_full.$error.required">Full Name is required.</span> 
</div> 

First Name: <input type="text" ng-model="person.name_first" /><br /> 
Last Name: <input type="text" ng-model="person.name_last" /><br /> 

Email: <input type="email" ng-model="person.email" name="person_email" required /><br /> 
<div ng-show="form.person_email.$dirty && form.person_email.$invalid">Invalid: 
    <span ng-show="form.person_email.$error.required">Email is required.</span> 
    <span ng-show="form.person_email.$error.email">This is not a valid email.</span> 
</div> 

最大的挑戰,使用樹枝來生成,這是該元素的名稱屬性AngularJS形式的一個例子。愚蠢的html表單不能嵌套,並要求每個名稱是唯一的。這個S2實現了它自己比較詳細的命名約定,部分基於元素順序,因此很難預測。

AngularJS需要名稱來處理客戶端驗證,這反過來可以使您的應用程序更具響應性並使用更少的帶寬。

S2需要名稱做服務器端驗證。這是一個基本的衝突。

AngularJS支持嵌套窗體和嵌套json數據。所以我們可以保持名字簡單。

這就是爲什麼我不認爲當前的S2表單組件與AngularJS很好地搭配。爲什麼有一個支持AngularJS的S2表單組件會很好。

+2

[您可以更改花括號](http://stackoverflow.com/questions/13671701/angularjs-twig-conflict-with-double-curly-braces)以任何您喜歡的方式,在AngularJS – Philipp

+1

關於我使用的大括號{%verbatim%} {{someexpression}} {%endverbatim%}在我的樹枝模板中。 – zuzuleinen

+0

是的,在解決方法是。但是,如果我編寫AngularJS應用程序,那麼我希望儘可能使用常見的AngularJS約定。爲了支持PHP TWIG,不得不更改默認的花括號,因爲其他一些服務器端模板生成器可能與我爲自定義標記選擇的內容產生衝突。 – Cerad