2013-07-16 2 views
45

Я генерирую пучок радиокнопок с использованием ng-repeat, а затем пытаюсь обновить модель, когда выбран один из них. Кажется, что это не работает.AngularJS - Модель не обновляется при выборе переключателя, созданного ng-repeat

Такая же разметка работает очень хорошо, когда радиовходы жестко закодированы, а не генерируются ng-repeat.

Это работает:

<input type="radio" ng-model="lunch" value="chicken" name="lunch"> 
<input type="radio" ng-model="lunch" value="beef" name="lunch"> 
<input type="radio" ng-model="lunch" value="fish" name="lunch"> 
{{lunch}} 

Это не:

<input type="radio" ng-model="lunch" ng-repeat="m in meat" value="m" name="lunch">  
{{lunch}} 

См jsfiddle показывает как здесь: http://jsfiddle.net/mark_up/A2qCS/1/

Любая помощь будет оценена.

Благодаря

ответ

93
<div ng-controller="DynamicCtrl"> 
    <input type="radio" ng-model="$parent.lunch" ng-repeat="m in meat" 
    ng-value="m" name="lunch">  
    {{lunch}} 
</div> 

Если сделать трюк.

Как я понимаю, ng-repeat создает свои собственные $scope. поэтому вам нужно обратиться к $parent $scope; Да, AngularJS сложно. Также вам необходимо изменить value на ng-value.

+33

Альтернативой использованию '$ parent' является использование свойства объекта в контроллере:' $ scope.selection = {lunch: 'chicken'}; ', then в HTML: ' {{selection.lunch}} ' –

+1

Спасибо @MarkRajcok! Он помещал '$ scope.selection = {lunch: 'chicken'};' в контроллере, который мне помог. И я обнаружил, что удалил свой «ng-checked =« true »из« html-переключателя », потому что этот параметр в контроллере автоматически или программно будет выбирать правильный переключатель. –

+0

@MarkRajcok, в чем смысл использования свойства объекта, чтобы избежать использования $ parent? –

4

выше вопрос был обсужден here

Это происходит потому, что нг-повтор создает новую область. В принципе, каждый <input> создает выбранное значение Option в своей собственной внутренней области. Чтобы обойти это, создайте новый объект-контейнер для этого значения. Например, вы могли бы объявить в контроллере:

$scope.data = {selectedOption: x}; 

А затем в шаблоне, используйте ng-model="data.selectedOption"

таким образом, нг-модель получает обновленный .. :)

это сложно

0

Просто нужно заменить значение на ng-значение

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