AngularJS nie wysyła ukrytej wartości pola

Dla konkretnego przypadku użycia muszę złożyć pojedynczy formularz "old way". Znaczy, używam formularza z action="". Odpowiedź jest przesyłana strumieniowo, więc nie przeładowuję strony. Jestem w pełni świadomy, że typowa aplikacja AngularJS nie przesłałaby formularza w ten sposób, ale na razie nie mam innego wyboru.

To powiedziawszy, starałem się zapełnić niektóre ukryte pola z Angular:

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

Należy pamiętać, że wyświetlana jest prawidłowa wartość w danych.

Formularz wygląda jak standard forma:

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

Jeśli nacisnę submit, żadna wartość nie zostanie wysłana do serwera. Jeśli zmienię pole wprowadzania na typ "tekst" to działa zgodnie z oczekiwaniami. Moim założeniem jest to, że ukryte pole nie jest tak naprawdę wypełnione, podczas gdy pole tekstowe jest wyświetlane ze względu na dwukierunkowe powiązanie.

Jakieś pomysły, Jak mogę przesłać ukryte pole wypełnione przez AngularJS?
Author: Christian, 2013-08-26

13 answers

Nie można używać podwójnego wiązania z ukrytym polem. Rozwiązaniem jest użycie nawiasów:

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

EDIT : zobacz ten wątek na GitHubie: https://github.com/angular/angular.js/pull/2574

EDIT:

Od Angular 1.2, możesz użyć dyrektywy 'ng-value', aby powiązać wyrażenie z atrybutem value input. Ta dyrektywa powinna być używana z wejściem radio lub checkbox, ale działa dobrze z ukrytym wejściem.

Oto rozwiązanie za pomocą ng-wartość:

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

Oto fiddle używające ng-value z ukrytym wejściem: http://jsfiddle.net/6SD9N

 280
Author: Mickael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 09:09:41

Zawsze możesz użyć type=text i display:none;, ponieważ Angular ignoruje ukryte elementy. Jak mówi OP, normalnie byś tego nie zrobił, ale to wygląda na szczególny przypadek.

<input type="text" name="someData" ng-model="data" style="display: none;"/>
 44
Author: tymeJV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 14:24:10

W kontrolerze:

$scope.entityId = $routeParams.entityId;

W widoku:

<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />
 8
Author: meffect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 22:54:51

Znalazłem fajne rozwiązanie napisane przez Mike ' a na sapiensworks. Jest to tak proste, jak użycie dyrektywy, która obserwuje zmiany w twoim modelu:

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

A następnie związać swoje wejście:

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

Ale rozwiązanie dostarczone przez tymeJV może być lepsze, ponieważ wejście Ukryte nie odpala zdarzenia zmiany w javascript, jak powiedział yycorman na ten post, więc przy zmianie wartości za pomocą wtyczki jQuery nadal będzie działać.

Edit Zmieniłem dyrektywę, aby zastosować nowa wartość wraca do modelu po wywołaniu zdarzenia change, więc będzie działać jako tekst wejściowy.

.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());
                });
            });
        }
    };
})

Więc po uruchomieniu zdarzenia $("#yourInputHidden").trigger('change') z jQuery, zaktualizuje również binded model.

 3
Author: Joan JB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:57

Osiągnąłem to przez-

 <p style="display:none">{{user.role="store_user"}}</p>
 2
Author: Vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 13:03:56

Znalazłem dziwne zachowanie dotyczące tej ukrytej wartości () i nie możemy tego zrobić.

Po zabawie okazało się, że najlepszym sposobem jest zdefiniowanie wartości w samym kontrolerze po zakresie formularza.

.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
Author: dcpartners,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 19:32:24

Update @ tymeJV 's answer eg:

 <div style="display: none">
    <input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>" >
 </div>
 1
Author: Albert.Qing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 02:37:54

Miałem ten sam problem, Naprawdę muszę wysłać klucz z mojego jsp do java script, Spędza około 4 godzin lub więcej mojego dnia, aby go rozwiązać.

Dołączam ten tag do mojego 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}. -->

Wynik był: Portfólio 1 criado com sucesso! ID = 3

Pozdrawiam

 0
Author: LeoJava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 14:46:43

Na wypadek, gdyby ktoś nadal miał z tym problem, miałem podobny problem podczas próby śledzenia sesji użytkownika / userid na formularzu wielostronicowym

Ive fixed that by adding

.kiedy ("/q2/: uid" w routingu:

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

I dodano to jako ukryte pole do przekazywania param pomiędzy stronami formularza webform

Jestem nowy w Angular, więc nie jestem pewien, czy jest to najlepsze możliwe rozwiązanie ale wydaje mi się, że teraz Działa ok

 0
Author: macieku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-28 16:16:26

Bezpośrednio przypisz wartość do modelu w atrybucie data-ng-value. Ponieważ Angular interpreter nie rozpoznaje ukrytych pól jako części ngModel.

<input type="hidden" name="pfuserid" data-ng-value="newPortfolio.UserId = data.Id"/>
 0
Author: Nikhil.Hmath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-03 16:18:44

Używam klasycznego javascript, aby ustawić wartość na ukryte wejście

$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
Author: Ivan Kuznietsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 11:00:30

Poniższy kod będzie działał dla tego IFF w tej samej kolejności, w jakiej został wymieniony upewnij się, że zamówienie jest wpisz następnie nazwę, ng-model ng-INIT, wartość. to wszystko.

 0
Author: Pawan Parashar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 05:34:23

Tutaj chciałbym podzielić się moim roboczym kodem:

<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
Author: J. Middya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 18:57:54