AngularJS n'envoie pas de valeur de champ cachée

Pour un cas d'utilisation spécifiques-je soumettre un formulaire unique "l'ancienne méthode". Moyen, j'utilise un formulaire avec action="". La réponse est en streaming, donc je ne suis pas le rechargement de la page. Je suis tout à fait conscient qu'une application typique D'AngularJS ne soumettrait pas un formulaire de cette façon, mais jusqu'à présent je n'ai pas d'autre choix.

cela dit, j'ai essayé de peupler quelques champs cachés de L'angle:

<input type="hidden" name="someData" ng-model="data" /> {{data}}

veuillez noter que la valeur correcte dans les données est montrée.

le formulaire ressemble à un formulaire standard:

<form id="aaa" name="aaa" action="/reports/aaa.html" method="post">
...
<input type="submit" value="Export" />
</form>

Si je frappe soumettre, aucune valeur n'est envoyée au serveur. Si je change le champ d'entrée en tapant "text", cela fonctionne comme prévu. Ma supposition est que le champ caché n'est pas vraiment peuplé, alors que le champ texte est en fait affiché en raison d'une liaison bidirectionnelle.

Comment puis-je soumettre un champ caché peuplé D'AngularJS?

184
demandé sur Christian 2013-08-26 18:19:08

13 réponses

vous ne pouvez pas utiliser double binding avec hidden field. La solution est d'utiliser des crochets :

<input type="hidden" name="someData" value="{{data}}" /> {{data}}

EDIT : voir ce fil sur github: https://github.com/angular/angular.js/pull/2574

EDIT:

depuis L'angle 1.2, vous pouvez utiliser la directive' ng-value ' pour lier une expression à l'attribut value de l'entrée. Cette directive devrait être utilisée avec la radio d'entrée ou la case à cocher mais fonctionne bien avec caché entrée.

Voici la solution en utilisant la valeur de ng:

<input type="hidden" name="someData" ng-value="data" />

voici un violon utilisant la valeur ng avec une entrée cachée: http://jsfiddle.net/6SD9N

280
répondu Mickael 2014-03-13 09:09:41

vous pouvez toujours utiliser un type=text et display:none; car angulaire ignore les éléments cachés. Comme dit L'OP, normalement tu ne ferais pas ça, mais ça semble être un cas spécial.

<input type="text" name="someData" ng-model="data" style="display: none;"/>
44
répondu tymeJV 2013-08-26 14:24:10

dans le contrôleur:

$scope.entityId = $routeParams.entityId;

dans la vue:

<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />
8
répondu meffect 2014-07-02 22:54:51

J'ai trouvé une bonne solution écrite par Mike sur sapiensworks . C'est aussi simple que d'utiliser une directive qui surveille les changements sur votre modèle:

.directive('ngUpdateHidden',function() {
    return function(scope, el, attr) {
        var model = attr['ngModel'];
        scope.$watch(model, function(nv) {
            el.val(nv);
        });
    };
})

et puis lier votre entrée:

<input type="hidden" name="item.Name" ng-model="item.Name" ng-update-hidden />

mais la solution fournie par tymeJV pourrait être meilleure que l'entrée cachée ne tire pas le changement d'événement dans javascript comme yycorman dit sur ce "post 151960920", donc en changeant la valeur par un jQuery plugin fonctionne toujours.

Modifier J'ai modifié la directive pour appliquer la nouvelle valeur de retour au modèle lorsque l'événement de changement est déclenché, de sorte qu'il fonctionnera comme un texte d'entrée.

.directive('ngUpdateHidden', function () {
    return {
        restrict: 'AE', //attribute or element
        scope: {},
        replace: true,
        require: 'ngModel',
        link: function ($scope, elem, attr, ngModel) {
            $scope.$watch(ngModel, function (nv) {
                elem.val(nv);
            });
            elem.change(function () { //bind the change event to hidden input
                $scope.$apply(function () {
                    ngModel.$setViewValue(  elem.val());
                });
            });
        }
    };
})

ainsi, lorsque vous déclenchez l'événement $("#yourInputHidden").trigger('change') avec jQuery, il mettra à jour le modèle lié.

3
répondu Joan JB 2017-05-23 11:54:57

j'ai réalisé cette via -

 <p style="display:none">{{user.role="store_user"}}</p>
2
répondu Vivek 2015-11-23 13:03:56

Trouvé un comportement étrange à propos de cette valeur cachée () et nous ne pouvons pas travailler.

après avoir joué autour de nous, nous avons trouvé la meilleure façon est juste défini la valeur dans le contrôleur lui-même après la portée de forme.

.controller('AddController', [$scope, $http, $state, $stateParams, function($scope, $http, $state, $stateParams) {

    $scope.routineForm = {};
    $scope.routineForm.hiddenfield1 = "whatever_value_you_pass_on";

    $scope.sendData = function {

// JSON http post action to API 
}

}])
2
répondu dcpartners 2015-12-05 19:32:24

mise à jour @tymeJV 's réponse par exemple:

 <div style="display: none">
    <input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>" >
 </div>
1
répondu Albert.Qing 2016-04-15 02:37:54

j'ai eu à faire face au même problème, J'ai vraiment besoin d'envoyer une clé de mon JSP à Java script, Il passe environ 4h ou plus de ma journée pour le résoudre.

j'inclus cette balise sur mon JavaScript / JSP:

 $scope.sucessMessage = function (){  
    	var message =     ($scope.messages.sucess).format($scope.portfolio.name,$scope.portfolio.id);
    	$scope.inforMessage = message;
    	alert(message);  
}
 

String.prototype.format = function() {
    var formatted = this;
    for( var arg in arguments ) {
        formatted = formatted.replace("{" + arg + "}", arguments[arg]);
    }
    return formatted;
};
<!-- Messages definition -->
<input type="hidden"  name="sucess"   ng-init="messages.sucess='<fmt:message  key='portfolio.create.sucessMessage' />'" >

<!-- Message showed affter insert -->
<div class="alert alert-info" ng-show="(inforMessage.length > 0)">
    {{inforMessage}}
</div>

<!-- properties
  portfolio.create.sucessMessage=Portf\u00f3lio {0} criado com sucesso! ID={1}. -->

le résultat a été: Portfólio 1 criado com sucesso! ID=3.

Meilleures Salutations

0
répondu LeoJava 2015-04-02 14:46:43

juste au cas où quelqu'un lutte encore avec cela, j'ai eu le même problème en essayant de garder la trace de session utilisateur / userid sur le formulaire de multipage

Ive fixe qu'en ajoutant

.lorsque("/t2/:uid" dans le routage:

    .when("/q2/:uid", {
        templateUrl: "partials/q2.html",
        controller: 'formController',
        paramExample: uid
    })

et a ajouté ceci comme un champ caché pour passer des params entre les pages webform

<< input type="hidden" nécessaire ng-model="formData.userid" ng-init= " formData.userid=uid "/ >

Je suis nouveau à angulaire donc pas sûr de sa la meilleure solution possible, mais il semble fonctionner bien pour moi maintenant

0
répondu macieku 2016-02-28 16:16:26

attribue directement la valeur au modèle dans l'attribut data-ng-value . Depuis Angular interpreter ne reconnaît pas les champs cachés comme faisant partie de ngModel.

<input type="hidden" name="pfuserid" data-ng-value="newPortfolio.UserId = data.Id"/>
0
répondu Nikhil.Hmath 2016-12-03 16:18:44

j'utilise un javascript classique pour définir la valeur de l'entrée cachée

$scope.SetPersonValue = function (PersonValue)
{
    document.getElementById('TypeOfPerson').value = PersonValue;
    if (PersonValue != 'person')
    {
        document.getElementById('Discount').checked = false;
        $scope.isCollapsed = true;
    }
    else
    {
        $scope.isCollapsed = false;
    }
}
0
répondu Ivan Kuznietsov 2016-12-22 11:00:30

ci-dessous code fonctionnera pour cette IFF il dans le même ordre que son mentionné assurez-vous de commande tapez le nom, ng-modèle gn-initialisation de la valeur. thats It.

0
répondu Pawan Parashar 2017-03-23 05:34:23

ici je voudrais partager mon code de travail:

<input type="text" name="someData" ng-model="data" ng-init="data=2" style="display: none;"/>
OR
<input type="hidden" name="someData" ng-model="data" ng-init="data=2"/>
OR
<input type="hidden" name="someData" ng-init="data=2"/>
0
répondu J. Middya 2018-09-08 18:57:54