2014-10-01 26 views
0

我有一個角的形式與該選擇元素:雙向與AngularJS結合選擇的子對象

<select ng-model="expense.category" ng-options="category.code for category in categories"></select>

其中費用是我的對象創建的形式和/編輯expense.category點子對象類別(具有屬性「id」和「code」),該屬性將由該控件選擇。

這一切都適用於創建新的費用 - 類別得到保存的方式應該是。當加載編輯所有內容的費用時也是如此 - 費用在控制器中有其類別。但是在表單中,select並沒有被預先填充正確的category-entry,它是空的,儘管所有的類都被加載到了select元素中。所以綁定只能以一種方式工作(從表單到模型),而不能用於選擇字段的其他方式(從模型到表單)。所有其他字段(費用屬性)都會被正確填寫到編輯表單中。

任何想法如何解決這個問題?

+0

究竟是不是工作?我做了一個工作jsfiddle演示:http://jsfiddle.net/hqsuwz35/1/ – friedi 2014-10-01 22:10:56

+0

我從數據庫中獲得類別,所以更真實的會是這樣的,顯示我有同樣的效果:http:// jsfiddle。 net/hqsuwz35/3/ – Ralf 2014-10-01 22:24:27

+0

你需要有一個參考。那麼怎麼樣通過代碼屬性在類別列表中搜索引用。這裏是jsfiddle的例子:http://jsfiddle.net/hqsuwz35/5/ – friedi 2014-10-01 22:32:38

回答

1

expense.category型號必須是categories陣列中的現有項目。

,你能做些什麼來實現這一目標是搜索數組中的權項(與代碼屬性的幫助)和categories陣列在參考替換現有的類別的副本。

這可能就像這樣:

myApp.controller('ctrl', function($scope) { 
    $scope.categories = [{code: 'sport'}, {code: 'music'}, {code: 'culture'}]; 
    $scope.expense = {category: {code: 'sport'}}; 

    function replaceWithReference(expense) { 
     var code = expense.category.code; 
     for(var i=0; i < $scope.categories.length; i++) { 
      if($scope.categories[i].code === code) { 
       expense.category = $scope.categories[i]; 
       return; 
      } 
     } 
    } 

    replaceWithReference($scope.expense); 
}); 

這裏是工作jsfiddle-demo

1

ng-optionsng-model之間的比較通過參考而不是價值來完成。我懷疑你的expense.category加載時是與categories陣列中的單獨實體。 您應該用從categories填充您的expense.category。 另一種選擇是用下拉式替換選擇。這將代表更多的代碼(你將不得不在ng-click上自己處理綁定),但會給你更多的比較和顯示控制權。