C'est une erreur courante dans les nouvelles applications angulaires. Vous ne voulez pas écrire vos valeurs dans votre HTML sur le serveur si vous pouvez l'éviter. En fait, si vous pouvez éviter que votre serveur ne rende entièrement le HTML, tant mieux.
Idéalement, vous souhaitez envoyer vos modèles Angular HTML, puis extraire vos valeurs via $ http dans JSON et les mettre dans votre portée.
Donc, si possible, faites ceci:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Si vous DEVEZ absolument rendre vos valeurs dans votre HTML à partir de votre serveur, vous pouvez les mettre dans une variable globale et y accéder avec $ window:
Dans l'en-tête de votre page, vous écrivez:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
Et puis dans votre contrôleur, vous l'obtiendrez comme ceci:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
J'espère que cela aide.
Si vous ne pouvez pas retravailler votre application pour faire ce que @blesh suggère (extraire les données JSON avec $ http ou $ resource et remplir $ scope), vous pouvez utiliser ng-init à la place:
Voir aussi AngularJS - L'attribut de valeur sur une zone de texte d'entrée est ignoré quand un modèle ng est utilisé?
la source
ng-init
est très utile lors de la définition de valeurs à partir de code-behind / postback, par exemple<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. Un peu moche? Oui, mais fait l'affaire et résout un mal de tête d'intégration dans le processus.C'est un correctif manifestement manquant, mais facilement ajouté pour AngularJS. Écrivez simplement une directive rapide pour définir la valeur du modèle à partir du champ de saisie.
Voici ma version:
la source
controller
pour votre directive, et pourquoi ne pas utiliser lalink
méthode ?. Je suis novice chez angularjsval = $attrs.ngInitial || $attrs.value || $element.val()
pour qu'il fonctionne avec des éléments sélectionnés.À mon humble avis, la meilleure solution est la directive @Kevin Stone, mais j'ai dû la mettre à niveau pour qu'elle fonctionne dans toutes les conditions (par exemple, sélectionnez, textarea), et celle-ci fonctionne à coup sûr:
la source
Vous pouvez utiliser une directive personnalisée (avec prise en charge de textarea, select, radio et checkbox), consultez ce billet de blog https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- champs-attributs / .
la source
Vous pouvez également utiliser dans votre code HTML:
ng-init="card.description = 12345"
Cela n'est pas recommandé par Angular, et comme mentionné ci-dessus, vous devez utiliser exclusivement votre contrôleur.
Mais ça marche :)
la source
J'ai une approche simple, car j'ai des validations et des masques lourds dans mes formulaires. J'ai donc utilisé jquery pour récupérer ma valeur et déclencher l'événement "change" pour les validations:
la source
Comme d'autres l'ont souligné, l'initialisation des données sur les vues n'est pas une bonne pratique. Cependant, l'initialisation des données sur les contrôleurs est recommandée. (voir http://docs.angularjs.org/guide/controller )
Pour que tu puisses écrire
et
De cette façon, les vues ne contiennent pas de données et le contrôleur initialise la valeur pendant le chargement des valeurs réelles.
la source
Si vous aimez l'approche de Kevin Stone ci-dessus https://stackoverflow.com/a/17823590/584761, envisagez une approche plus simple en écrivant des directives pour des balises spécifiques telles que 'input'.
Si vous suivez cette voie, vous n'aurez pas à vous soucier d'ajouter ng-initial à chaque balise. Il définit automatiquement la valeur du modèle sur l'attribut value de la balise. Si vous ne définissez pas l'attribut value, il sera par défaut une chaîne vide.
la source
Voici une approche centrée sur le serveur:
C'est la même idée de base que les réponses les plus populaires à cette question, à l'exception de $ provide.value enregistre un service qui contient vos valeurs par défaut.
Donc, sur le serveur, vous pourriez avoir quelque chose comme:
Et mettez-le dans votre page via la technologie côté serveur de votre choix. Voici un aperçu: https://gist.github.com/exclsr/c8c391d16319b2d31a43
la source
Celui-ci est une version plus générique des idées mentionnées ci-dessus ... Il vérifie simplement s'il y a une valeur dans le modèle, et sinon, il définit la valeur du modèle.
JS:
HTML (exemple d'utilisation):
la source
$scope
l'appel àgetter()
- j'espère que cela clarifiera les choses pour quiconque essaie cela!J'ai essayé ce que @Mark Rajcok a suggéré. Il fonctionne pour les valeurs de chaîne (Visa-4242). Veuillez vous référer à ce violon .
Du violon:
La même chose qui est faite dans le violon peut être faite en utilisant
ng-repeat
, ce que tout le monde pourrait recommander. Mais après avoir lu la réponse donnée par @Mark Rajcok, je voulais juste essayer la même chose pour un formulaire avec un tableau de profils. Les choses fonctionnent bien jusqu'à ce que j'aie le $ scope.profiles = [{}, {}]; code dans le contrôleur. Si je supprime ce code, j'obtiens des erreurs. Mais dans des scénarios normaux, je ne peux pas imprimer$scope.profiles = [{},{}];
lorsque j'imprime ou que je fais écho au HTML du serveur. Sera-t-il possible d'exécuter ce qui précède, de la même manière que @Mark Rajcok l'a fait pour les valeurs de chaîne comme<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, sans avoir à faire écho à la partie JavaScript du serveur.la source
Ajout de la prise en charge de l'élément sélectionné à Ryan Montgomery "fix"
});
la source
Si vous avez la valeur init dans l'URL comme
mypage/id
, dans le contrôleur du JS angulaire, vous pouvez utiliserlocation.pathname
pour trouver l'id et l'assigner au modèle que vous voulez.la source