對於Angular和MV *,我一般都很陌生(因爲我幾年來一直在用Ruby on Rails觀察其他開發者的工作),所以請原諒那可能是一個天真的問題。在AngularJS中,我可以/應該從控制器擴充模型嗎?
我試圖設置一個typeahead字段,用戶可以輸入街道地址並從Google Geocoding API獲取實時建議。我從UI自舉這個例子(以下簡稱「異步結果」例如,在中間字段)逐字開始:
http://angular-ui.github.io/bootstrap/#/typeahead
它的工作地方,但現在我想擴展它來收集地址的其它相關細節並將其與其他表單數據一起提交。例如,如果地理編碼API在其結果(example here)中返回country
類型address_components
,我想將其添加到我POST到服務器的表單數據中。 (關於如何/需要捕獲哪些屬性,還有其他的邏輯,但這是一個很好的起點。)
現在,只有由Geocoding API返回的formatted_address
屬性纔會以表格形式提交,如ui.bootstrap.typeahead
指令使用ng-model
將其綁定到前面的指令<input>
。
所以,我的問題是雙重的(但請隨時解決或單獨):
- 如果我是從頭開始(即未綁定到UI引導所做的設計/實施的決定),實現這個目標的最「方法」是什麼?對於每個值,我的可能想要捕獲,然後控制器將處理填充可用的值,該指令是否應創建一個
<input>
約束與ng-model
? - 由於我並非從頭開始,所以增加現有代碼以提供此功能的合理方法是什麼?有沒有一種方法可以將特性添加到現有的指令中?這種行爲屬於控制器嗎?還是我最好把它抽象成一個服務?或者我是否會過度 - 是否有更簡單或更好的方式,我沒有考慮過?根據UI Bootstrap的例子,我現在看到的唯一顯而易見的地方就是將成功函數傳遞給
.then()
,其中我處理$http
響應,但我的直覺表明這並不理想。我所能想象的只是在我正在創建的表單值對象中添加屬性(即,我將在表單提交時發佈的對象),但是我必須知道這些屬性的名稱,所以現在我的控制器是與其使用的形式過於緊密相關。
在此先感謝您的幫助。我希望這是有道理的。由於我仍然掌握基本概念,如果您可以指向任何類似的現有代碼,或者參考可提供一些見解的特定文檔或文章,那麼這將特別有用。
非常感謝!這很有幫助。因此,一旦我的服務將我從Geocoding API結果中提取的數據(例如國家/地區)返回到typeahead控制器,我如何才能使其可用於表單控制器(包裝打字機)以便將其發佈表單提交? FWIW,我正在使用Restangular,我只能提供一個對象,以便爲POST正文序列化。這是我認爲需要增強的對象,但是如果我的控制器添加了特定的屬性,那麼它不能以其他形式重用。如果您需要查看代碼示例以更好地理解,請告訴我。 – Bungle
更一般地說 - 如果我有一個控制器爲
控制器通過服務或通過在範圍中暴露(和繼承)的對象在它們自己之間「交談」。無論哪種方式,表單控制器都應該擁有** it **需要處理表單提交的所有信息(即'ng-submit')。我認爲你正在從經典的HTML/Javascript的角度來思考它,在這裏,表單提交數據在其封閉的''元素中。使用Angular,控制器只有ViewModel,它不關心它需要的對象是否由''或其他設置。 –