Подтвердить что ты не робот

Установка имен динамических ng-моделей в AngularJS

Здесь есть похожие вопросы и , хотя мой прецедент немного отличается.

У меня есть объект с именем uniqueLists, который выглядит так:

$scope.uniqueLists - {
    name: [
            'string1',
            'string2',
            'string3'
            // Lots of strings
    ],
    Category: [
            'string1',
            'string2',
            'string3'
            // Lots of strings
    ],
    designer: [
            'string1',
            'string2',
            'string3'
            // Lots of strings
    ]
}

Я пытаюсь создать функцию поиска из этого списка. В настоящее время я могу отображать все элементы списка на флажках на странице, подобной этой (в следующем коде используется механизм шаблонов Jade для Node/ExpressJS, это достаточно легко понять, даже если вы не знакомы с ним. Отступ == ребенок node строки над ним)

div(class="searchNav")
    p(ng-repeat="param in searchParams") {{param[0] + ' = ' + param[1]}}

    div.row-fluid(ng-repeat="(key,val) in uniqueLists")
        form(ng-model="???") {{key}}
            label.checkbox(ng-repeat="value in val")
                input(type="checkbox", ng-model="?????") 
                {{value}}

Единственная проблема, с которой я столкнулся, - это ng-model моей формы и флажков. Я хочу form ng-model == {{key}}. Я пробовал установить это, но он разбивает Angular. Я также пробовал ng-model='uniqueLists[index][0]', но, опять же, Angular не анализирует это и просто делает каждую форму модели строкой uniqueLists[index][0].

То же самое касается флажков input, я хочу их ng-model="{{value}}". Есть ли способ сделать это в моем контроллере? Я не могу думать ни о чем, что будет работать внутри ng-repeat.

Небольшая заметка для всех, кто наткнулся на этот вопрос

Как вы увидите в ответе/скрипке ниже, когда вы ссылаетесь на объект/позиции в ng-model, они не отображаются в их правильные имена в DOM, но они кажутся работать с Angular, как будто они есть.

Например, в приведенном выше коде установка ng-model="uniqueLists[key][val]" отображает в DOM как ng-model="uniqueLists[key][val]", но ведет себя так, как будто она ng-model="uniqueLists[name][string1]".

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

4b9b3361

Ответ 1

Я все еще не совсем уверен, что понял всю вашу проблему, но я все равно дам вам этот код: http://jsfiddle.net/DotDotDot/7AU6A/1/

Чтобы немного объяснить, я использовал слегка измененный образец данных (чтобы иметь уникальные строки), и вместо того, чтобы создавать модель, просто равную определенному {{value}}, я поместил все модели в объект, поэтому вы можете легко перейти к объекту [key] [value] (в вашем случае это будет что-то вроде объекта ['name'] ['string1']), и я привязал эти значения к флажкам. Единственное, что мне нужно было сделать, это создать его из объекта образца данных, поэтому он заставит контроллер разобрать все данные один раз.

Это довольно много, если вы видите его в действии (значения отображаются внизу скрипта). Скажем, вы нажмете флажок name= > string2, значение объекта ['name'] ['string2'] будет соответствовать состоянию флажка, который будет автоматически просматриваться ng-моделью.

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

На стороне HTML это не большая модификация (извините, что я не знаком с вашими шаблонами, это будет прямой HTML)

    <div ng-repeat='(key,val) in uniqueLists'>
       <form name='{{key}}'>
       {{key}}
            <p ng-repeat='value in val'>
                <input type='checkbox' ng-model='selectedData[key][value]' />{{value}}
            </p>
        </form>

    </div>

И на стороне контроллера это то, как я инициализирую модели:

$scope.selectedData={};
for (var i in $scope.uniqueLists)
{
 $scope.selectedData[i]={}
     for(var j in $scope.uniqueLists[i])
     {
         $scope.selectedData[i][$scope.uniqueLists[i][j]]=false;
     }
}

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

Это то, что вы хотели?

Ответ 2

@DotDotDot

Я столкнулся с одним и тем же pb с _dynamic_names_ и полностью понимаю автора Q. С вами пример почти все работает отлично EXCEPT (!), отправляя. Пожалуйста, взгляните на прилагаемый скриншот.

В этом примере ng-model должны быть динамическими, например: selectedData_A_1, selectedData_B_2, selectedData_C_3, e.t.c...

... только тогда, в случае использования HTML-Form-Submit будет возможность декодировать значение флажка в зависимости от имени.

enter image description here