Quero preencher um formulário com algumas perguntas dinâmicas (mexa aqui ):
<div ng-app ng-controller="QuestionController">
<ul ng-repeat="question in Questions">
<li>
<div>{{question.Text}}</div>
<select ng-model="Answers['{{question.Name}}']" ng-options="option for option in question.Options">
</select>
</li>
</ul>
<a ng-click="ShowAnswers()">Submit</a>
</div>
function QuestionController($scope) {
$scope.Answers = {};
$scope.Questions = [
{
"Text": "Gender?",
"Name": "GenderQuestion",
"Options": ["Male", "Female"]},
{
"Text": "Favorite color?",
"Name": "ColorQuestion",
"Options": ["Red", "Blue", "Green"]}
];
$scope.ShowAnswers = function()
{
alert($scope.Answers["GenderQuestion"]);
alert($scope.Answers["{{question.Name}}"]);
};
}
Tudo funciona, exceto que o modelo é literalmente Respostas ["{{question.Name}}"], em vez das Respostas avaliadas ["GenderQuestion"]. Como posso definir esse nome de modelo dinamicamente?
ng-pattern="field.pattern"
quando o que eu realmente queria erapattern="{{field.pattern}}"
. É meio confuso que o angular geralmente fornece um auxiliar para atributos dinâmicos, mas desta vez escreveu sua própria validação do lado do cliente e deu a ela o mesmo nome.Você pode usar algo assim
scopeValue[field]
, mas se o seu campo estiver em outro objeto, você precisará de outra solução.Para resolver todos os tipos de situações, você pode usar esta diretiva:
Exemplo de HTML:
fonte
ng-model="{{ variable }}"
:)O que acabei fazendo é algo assim:
No controlador:
então, nos modelos, eu poderia usar nomes totalmente dinâmicos, e não apenas sob um determinado elemento codificado (como em seu caso "Respostas"):
Espero que isto ajude.
fonte
Para tornar a resposta fornecida por @abourget mais completa, o valor de scopeValue [field] na linha de código a seguir pode ser indefinido. Isso resultaria em um erro ao definir o subcampo:
Uma maneira de resolver esse problema é adicionando um atributo ng-focus = "nullSafe (field)", de modo que seu código se pareça com o seguinte:
Em seguida, você define nullSafe (campo) em um controlador como o abaixo:
Isso garantiria que scopeValue [field] não fosse indefinido antes de definir qualquer valor para scopeValue [field] [subfield].
Nota: Você não pode usar ng-change = "nullSafe (field)" para obter o mesmo resultado porque ng-change acontece depois que o ng-model foi alterado, o que geraria um erro se scopeValue [field] fosse indefinido.
fonte
Ou você pode usar
fonte