1

對於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>

所以,我的問題是雙重的(但請隨時解決或單獨):

  1. 如果我是從頭開始(即未綁定到UI引導所做的設計/實施的決定),實現這個目標的最「方法」是什麼?對於每個值,我的可能想要捕獲,然後控制器將處理填充可用的值,該指令是否應創建一個<input>約束與ng-model
  2. 由於我並非從頭開始,所以增加現有代碼以提供此功能的合理方法是什麼?有沒有一種方法可以將特性添加到現有的指令中?這種行爲屬於控制器嗎?還是我最好把它抽象成一個服務?或者我是否會過度 - 是否有更簡單或更好的方式,我沒有考慮過?根據UI Bootstrap的例子,我現在看到的唯一顯而易見的地方就是將成功函數傳遞給.then(),其中我處理$http響應,但我的直覺表明這並不理想。我所能想象的只是在我正在創建的表單值對象中添加屬性(即,我將在表單提交時發佈的對象),但是我必須知道這些屬性的名稱,所以現在我的控制器是與其使用的形式過於緊密相關。

在此先感謝您的幫助。我希望這是有道理的。由於我仍然掌握基本概念,如果您可以指向任何類似的現有代碼,或者參考可提供一些見解的特定文檔或文章,那麼這將特別有用。

回答

1

On#1,Angular-UI設計是一種非常「角度」的實現方式 - 我沒有看到任何問題。該指令採用列表並返回選定的列表項。這是控制器看到它的方式。換句話說,另一個指令,比如一個典型的<select>或者一個自定義的無限滾動或yelp風格的地圖,將提供不同的View行爲,但從控制器的角度來看,它在功能上是等價的 - 這就保持了關注的分離完好無損,因此非常MVVM-y。

我也認爲你對ng-model有一些困​​惑。 ng-model應與用戶直接與其交互的輸入控件(不僅是<input>)一起使用。在這種情況下,唯一的輸入是一個前面的指令。

關於#2,它取決於「其他相關細節」是服務API的自然部分,還是需要在選擇之後提取它們。假設前者,理論上,正確的地方是服務。控制器只應該將來自服務的數據封送到ViewModel並返回。

對於具體的國家代碼示例,API返回address_components屬性中的多個組件。提取國家代碼 - 以及檢查它是否存在以及其他業務邏輯 - 最好在服務中處理,可能在選擇之後使用另一個服務API,或者獲得原始地址列表時 - 無論有意義爲你的情況。

對於一個簡單的應用程序一個簡單的例子,比如上例中,你可以只需修改$scope.getLocation()函數返回控制器(或者說您的視圖模型)確實需要實際對象的列表,然後讓查看返回所選對象(按照#1)。

+0

非常感謝!這很有幫助。因此,一旦我的服務將我從Geocoding API結果中提取的數據(例如國家/地區)返回到typeahead控制器,我如何才能使其可用於表單控制器(包裝打字機)以便將其發佈表單提交? FWIW,我正在使用Restangular,我只能提供一個對象,以便爲POST正文序列化。這是我認爲需要增強的對象,但是如果我的控制器添加了特定的屬性,那麼它不能以其他形式重用。如果您需要查看代碼示例以更好地理解,請告訴我。 – Bungle

+0

更一般地說 - 如果我有一個控制器爲

(稱之爲FormCtrl),並且包裝另一個控制器,它會生成一些額外的值,我想使用基於的值提交的值(稱之爲InputCtrl ),我可以這樣做,即InputCtrl不必知道FormCtrl的具體細節,以提供該數據?如果是這樣,怎麼樣?換句話說,InputCtrl可以告訴FormCtrl「我有一些額外的數據給你」,FormCtrl可以說「謝謝,我知道該把它放在哪裏?」 – Bungle

+1

控制器通過服務或通過在範圍中暴露(和繼承)的對象在它們自己之間「交談」。無論哪種方式,表單控制器都應該擁有** it **需要處理表單提交的所有信息(即'ng-submit')。我認爲你正在從經典的HTML/Javascript的角度來思考它,在這裏,表單提交數據在其封閉的''元素中。使用Angular,控制器只有ViewModel,它不關心它需要的對象是否由''或其他設置。 –

相關問題