2014-05-15 3 views
0

Итак, у меня есть этот код FiddlePopulate скрытого поля с последним выбранным значением с помощью angular.js

<div ng-app="testApp"> 
<div ng-controller="MainCtrl"> 
    <form> 
     <p> 
      <select ng-model="selectedItem" ng-options="i.name for i in items"></select> 
     </p> 
     <p ng-show="selectedItem.subItems"> 
      <select ng-model="selectedSubItem" ng-options="i.name for i in selectedItem.subItems"></select> 
     </p> 

     <p ng-show="selectedSubItem.subItems"> 
      <select ng-model="selectedSubSubItem" ng-options="i.name for i in selectedSubItem.subItems"></select> 
     </p> 

     <input type="hidden" name="selection" value="????"> 

     <input type="submit" value="submit"> 
    </form> 

</div> 

И в этом коде я только показать следующее выпадающее меню, если выбранный элемент имеет ребенок массив. Теперь я хочу заполнить значение скрытого поля последним выбранным значением этой выпадающей цепи, используя Angular.js.

Другим словом, если пользователь выбирает вариант в последнем раскрывающемся списке, который появляется, я хочу, чтобы это скрытое поле в конце отображало это значение для формы.

Как я могу это сделать?

ответ

0

Это может сделать, если длина цепи фиксируется:

<input type="hidden" name="selection" 
    value="{{ (selectedSubSubItem || selectedSubItem || selectedItem).name }}"/> 

Чтобы решить эту проблему с выходом назад в цепи, простое решение заключается в использовании ng-change и свести на нет всех следующих значений, а именно:

<select ng-model="selectedItem" ng-options="i.name for i in items" 
    ng-change="selectedSubItem=null;selectedSubSubItem=null"></select> 

См раздвоенной скрипки: http://jsfiddle.net/zH77p/1/


В качестве альтернативы ng-change, вы можете использовать часы в области; преимуществом является то, что часы необходимо знать только их немедленного ребенка:

$scope.$watch("selectedItem", function(newval, oldval) { 
    if(newval !== oldval) $scope.selectedSubItem = null; 
}); 
$scope.$watch("selectedSubItem", function(newval, oldval) { 
    if(newval !== oldval) $scope.selectedSubSubItem = null; 
}); 
+0

Это работает вперед в цепочке, но при движении назад оно застряло при последнем значении. – Ruby

+0

Хорошо, я обновил ответ и добавил скрипку. –

+0

Это хорошо работает, он работает, когда идет назад в цепочке, но если я нахожусь в последнем варианте и изменил самый первый вариант, он снова застрял, мне пришлось бы вернуться в цепочку один за другим, чтобы работать должным образом. – Ruby

1

Вы можете использовать:

<input type="hidden" name="selection" value="{{selectedSubSubItem.name}}"> 

Двусторонний связывание будет обновлять значение скрытого ввода после того, как значение соответствующего select получает изменилось.

Если вы хотите, чтобы он динамически на основе последнего выбранного:

<input type="hidden" name="selection" value="{{selectedSubSubItem.name || selectedSubItem.name || selectedItem.name}}"> 

Если вы хотите, чтобы иметь возможность вернуться в цепи это поможет. Но я настоятельно рекомендую, чтобы переместить эту логику в контроллер:

<input type="hidden" name="selection" value="{{(selectedSubItem.subItems ? selectedSubSubItem.name : false) || (selectedItem.subItems ? selectedSubItem.name : false) || selectedItem.name}}"> 
+0

Но это только заселить скрытое поле с самое последнее значение цепочки. Я хочу заполнить скрытое поле тем, что было последним значением, которое выбрал пользователь. – Ruby

+0

@ пользователь1706198 ok, это было непонятно. Но это легко сделать (см. Обновление). – Sebastian

0

Поскольку вы заинтересованы в этом типе «прикован выбора», вам нужно использовать некоторые более сложную логику. Вот скрипка: http://jsfiddle.net/2Az4P/3/ Я использовал нг-значение, но вы можете оставить свое значение и установить его на

value="{{choiceValue()}} 

, который будет иметь тот же эффект. То, что я сделал, это сделать ответы в массиве (selectedItem = []), а затем заполнить его, когда я иду (обратите внимание на ng-model каждого выбора).

При каждом выборе значение обновляется соответствующим образом с использованием функции choiceValue(), которая обновляет ng-value соответственно.

Таким образом, вы можете добавить столько цепей в цепочку и просто обновить их число (на самом деле вы можете использовать для этого ng-repeat и использовать $index для автоматического создания дополнительных уровней выбора).

Это немного больше работы, но вы можете увидеть основы здесь: http://jsfiddle.net/brendanowen/uXbn6/8/

Все зависит от того, насколько сложна/автоматизирован вам нужно сделать это :)

+0

Это работает, но по какой-то причине он не показывает третье выпадающее меню. – Ruby

+0

Это очень полезно. Но почему в первой скрипке появляется только второе выпадающее меню, а не третье? – Ruby

+0

Я обновил скрипку. У меня была опечатка в имени переменной. Вот почему использование ng-repeat для создания серии выборок может быть очень удобным - не так много набирать, поэтому меньше шансов опечаток :) – yccteam

Смежные вопросы