Este es un error común en las nuevas aplicaciones angulares. No puede escribir sus valores en su HTML en el servidor si puede evitarlo. De hecho, si puede evitar que su servidor procese HTML por completo, mucho mejor.
Idealmente, desea enviar sus plantillas HTML angulares, luego baje sus valores a través de $ http en JSON y colóquelos en su alcance.
Entonces, si es posible, haga esto:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Si absolutamente DEBE representar sus valores en su HTML desde su servidor, puede colocarlos en una variable global y acceder a ellos con $ window:
En el encabezado de tu página escribirías:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
Y luego en su controlador lo obtendría así:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
Espero que eso ayude.
Si no puede modificar su aplicación para hacer lo que @blesh sugiere (extraiga los datos JSON con $ http o $ resource y complete $ scope), puede usar ng-init en su lugar:
Consulte también AngularJS: ¿Se ignora el atributo de valor en un cuadro de texto de entrada cuando se utiliza un modelo ng?
fuente
ng-init
es bastante útil al establecer valores de código subyacente / devolución de datos, por ejemplo<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. ¿Un poco feo? Sí, pero hace el truco y resuelve un dolor de cabeza de integración en el proceso.Obviamente, esta es una solución que falta, pero se agrega fácilmente para AngularJS. Simplemente escriba una directiva rápida para establecer el valor del modelo desde el campo de entrada.
Aquí está mi versión:
fuente
controller
tu directiva y por qué no usaste ellink
método? Soy novato en angularjsval = $attrs.ngInitial || $attrs.value || $element.val()
para que funcione con elementos seleccionados.En mi humilde opinión, la mejor solución es la directiva @Kevin Stone, pero tuve que actualizarla para que funcione en todas las condiciones (fe select, textarea), y esta está funcionando con seguridad:
fuente
Puede usar una directiva personalizada (con soporte para textarea, select, radio y checkbox), consulte esta publicación de blog https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- campos-atributos / .
fuente
También puede usar dentro de su código HTML:
ng-init="card.description = 12345"
Angular no lo recomienda, y como se mencionó anteriormente, debe usar exclusivamente su controlador.
Pero funciona :)
fuente
Tengo un enfoque simple, porque tengo algunas validaciones y máscaras pesadas en mis formularios. Entonces, utilicé jquery para obtener mi valor nuevamente y disparar el evento "change" a validaciones:
fuente
Como otros señalaron, no es una buena práctica inicializar datos en vistas. Sin embargo, se recomienda inicializar los datos en los Controladores. (ver http://docs.angularjs.org/guide/controller )
Entonces puedes escribir
y
De esta forma, las vistas no contienen datos y el controlador inicializa el valor mientras se cargan los valores reales.
fuente
Si le gusta el enfoque de Kevin Stone arriba https://stackoverflow.com/a/17823590/584761 considere un enfoque más fácil escribiendo directivas para etiquetas específicas como 'input'.
Si sigue esta ruta, no tendrá que preocuparse por agregar ng-initial a cada etiqueta. Establece automáticamente el valor del modelo en el atributo de valor de la etiqueta. Si no establece el atributo de valor, el valor predeterminado será una cadena vacía.
fuente
Aquí hay un enfoque centrado en el servidor:
Es la misma idea básica que las respuestas más populares a esta pregunta, excepto que $ provide.value registra un servicio que contiene sus valores predeterminados.
Entonces, en el servidor, podría tener algo como:
Y colóquelo en su página a través de la tecnología del lado del servidor que elija. Aquí hay un resumen: https://gist.github.com/exclsr/c8c391d16319b2d31a43
fuente
Esta es una versión más genérica de las ideas mencionadas anteriormente ... Simplemente verifica si hay algún valor en el modelo, y si no, establece el valor para el modelo.
JS:
HTML (ejemplo de uso):
fuente
$scope
a la llamada agetter()
- ¡espero que esto aclare las cosas para cualquier otra persona que intente esto!Probé lo que sugirió @Mark Rajcok. Está funcionando para valores de cadena (Visa-4242). Por favor, consulte este violín .
Desde el violín:
Lo mismo que se hace en el violín se puede hacer usando
ng-repeat
, lo que todos podrían recomendar. Pero después de leer la respuesta dada por @Mark Rajcok, solo quería probar lo mismo para un formulario con una variedad de perfiles. Las cosas funcionan bien hasta que tenga el $ scope.profiles = [{}, {}]; código en el controlador. Si elimino este código, obtengo errores. Pero en escenarios normales no puedo imprimir$scope.profiles = [{},{}];
como imprimo o echo html desde el servidor. ¿Será posible ejecutar lo anterior, de manera similar a como lo hizo @Mark Rajcok para los valores de cadena como<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, sin tener que hacer eco de la parte JavaScript del servidor.fuente
Acabo de agregar soporte para el elemento seleccionado para "arreglar" Ryan Montgomery
});
fuente
Si tiene el valor init en la URL como
mypage/id
, entonces en el controlador del JS angular puede usarlocation.pathname
para encontrar la identificación y asignarla al modelo que desee.fuente