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?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
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;"/>
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" />
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.
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>
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
}
}])
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>
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
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
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"/>
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;
}
}
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.
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"/>
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