Quiero llenar un formulario con algunas preguntas dinámicas (violín aquí ):
<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}}"]);
};
}
Todo funciona, excepto que el modelo es literalmente Respuestas ["{{question.Name}}"], en lugar de las Respuestas evaluadas ["GenderQuestion"]. ¿Cómo puedo configurar el nombre de ese modelo de forma dinámica?
ng-pattern="field.pattern"
cuando lo que realmente quería erapattern="{{field.pattern}}"
. Es un poco confuso que angular generalmente proporciona un ayudante para atributos dinámicos, pero esta vez escribió su propia validación del lado del cliente y le dio el mismo nombre.Puede usar algo como esto
scopeValue[field]
, pero si su campo está en otro objeto, necesitará otra solución.Para resolver todo tipo de situaciones, puede utilizar esta directiva:
Ejemplo de HTML:
fuente
ng-model="{{ variable }}"
:)Lo que terminé haciendo es algo como esto:
En el controlador:
así que en las plantillas podría usar nombres totalmente dinámicos, y no solo bajo un determinado elemento codificado (como en su caso "Respuestas"):
Espero que esto ayude.
fuente
Para que la respuesta proporcionada por @abourget sea más completa, el valor de scopeValue [campo] en la siguiente línea de código podría no estar definido. Esto resultaría en un error al configurar el subcampo:
Una forma de resolver este problema es agregando un atributo ng-focus = "nullSafe (campo)", por lo que su código se vería como el siguiente:
Luego, define nullSafe (campo) en un controlador como el siguiente:
Esto garantizaría que scopeValue [campo] no esté indefinido antes de establecer cualquier valor en scopeValue [campo] [subcampo].
Nota: No puede usar ng-change = "nullSafe (field)" para lograr el mismo resultado porque ng-change ocurre después de que el ng-model ha sido cambiado, lo que arrojaría un error si scopeValue [field] no está definido.
fuente
O puedes usar
fuente