AngularJS: как поставить правильную модель на повторяющиеся переключатели

Я думаю, что у меня есть какой-то особый код, так как все, что я мог найти в Google, было «слишком простым» для моей проблемы, и это также не помогло найти решение самостоятельно, к сожалению. У меня есть группа радиокнопок из 2 радио. Я перебираю данные «типа» из бэкэнда, чтобы создать переключатели. Моя проблема заключается в привязке данных: когда я хочу отредактировать объект, его «тип» установлен правильно, но не зарегистрирован представлением, поэтому он не выбирает нужный параметр.

Следуя моей ситуации:
Серверная часть предоставляет мне это как "typeList":

[
 {"text":"cool option","enumm":"COOL"},
 {"text":"option maximus","enumm":"MAX"}
] 

HTML-код:

<span ng-repeat="type in typeList track by type.enumm">
    <input 
         type="radio" 
         name="type" required 
         ng-model="myCtrl.object.type" 
         ng-value="type">
    {{type.text}}
</span>

Некоторое объяснение
Я не хочу использовать "голый" текст, я хочу использовать какой-то идентификатор - в данном случае это перечисление. Выбранное значение должно быть полным «типом», а не только «type.text», поскольку бэкэнд ожидает тип, а не простой строкой. Так что все, что я делаю с этим, всегда является пакетом, type.text предназначен для форматированного/интернационализированного текста и т. д.

Предварительный выбор работает, устанавливая это в контроллере: this.object.type = typeList[0]; Первый переключатель уже выбран, замечательно.

Но почему он не выбран при редактировании объекта. Я сделал «журнал» в HTML с помощью {{myCtrl.object.type}}, и результат {"text":"cool option","enumm":"COOL"}. То же, что и при предварительном выборе. Я уже работаю с той же «техникой», используя выбор входных данных, и она отлично работает. Я также нашел некоторые результаты Google, в которых говорится: «используйте $parent из-за родительской/дочерней области». Но 1) я не понял это прямо и 2) думаю, что проблема не в этом, так как я использую область действия контроллера, а не область $, или это неправильное мышление?

Это может быть объяснено плохо, извините, если так, но я надеюсь, что кто-то 1) получит то, что я хочу, и 2) знает решение для этого.

Благодарю вас!


person BAERUS    schedule 29.08.2014    source источник


Ответы (1)


Если вы пытаетесь привязаться к элементам из массива, я считаю, что вам нужно присвоить фактические элементы из массива свойству вашей модели.

Таким образом, создается новый объект и устанавливается значение $scope.selectedType (не то, что вы хотите):

$scope.selectedType = {"text":"cool option","enumm":"COOL"};

тогда как это назначает первый элемент массива (это то, что вы хотите)

$scope.selectedType = $scope.typeList[0];

Итак, чтобы изменить модель, вы можете найти запись в массиве и назначить ее своей модели примерно так:

$scope.selectedType = $scope.typeList.filter(...)

Вот краткий пример такого подхода: http://plnkr.co/edit/wvq8yH7WIj7rH2SBI8qF

person MPowerKC    schedule 29.08.2014
comment
Прежде всего, спасибо за ваши усилия! К сожалению, ваш плункер мне не помог, но я попытался использовать вашу идею получения правильного элемента массива. И я рад, что сработало! Что и приятно, и раздражает, почему я не могу использовать свою уже заполненную модель? Потому что то, что я сейчас делаю, это: if(!self.object.type) { self.object.type = $scope.typeList[0]; } else { self.object.type = _.filter($scope.typeList, self.object.type)[0]; } но ладно, пока работает мне этого достаточно :) Спасибо! - person BAERUS; 30.08.2014