AngularJS не отправляет скрытое значение поля
Для конкретного варианта использования я должен представить одну форму "старый способ". Значит, я использую форму с действием = "". Ответ передан, поэтому я не перезагружаю страницу. Я полностью понимаю, что типичное приложение AngularJS не представило бы такую форму, но пока у меня нет другого выбора.
Тем не менее, я попытался заполнить некоторые скрытые поля из Angular:
<input type="hidden" name="someData" ng-model="data" /> {{data}}
Обратите внимание, что отображается правильное значение в данных.
Форма выглядит как стандартная форма:
<form id="aaa" name="aaa" action="/reports/aaa.html" method="post">
...
<input type="submit" value="Export" />
</form>
Если я нажал submit, на сервер не будет отправлено никакого значения. Если я изменил поле ввода, чтобы набрать "текст", он работает так, как ожидалось. Мое предположение заключается в том, что скрытое поле действительно не заполнено, в то время как текстовое поле фактически отображается с помощью двусторонней привязки.
Любые идеи, как я могу представить скрытое поле, заполненное AngularJS?
Ответы
Ответ 1
Вы не можете использовать двойное связывание со скрытым полем.
Решение заключается в использовании скобок:
<input type="hidden" name="someData" value="{{data}}" /> {{data}}
EDIT: см. эту тему в github: https://github.com/angular/angular.js/pull/2574
EDIT:
Так как Angular 1.2, вы можете использовать директиву "ng-value" для привязки выражения к атрибуту value ввода. Эта директива должна использоваться с входным радио или флажком, но хорошо работает со скрытым вводом.
Вот решение, использующее ng-значение:
<input type="hidden" name="someData" ng-value="data" />
Вот скрипка, использующая ng-значение со скрытым вводом: http://jsfiddle.net/6SD9N
Ответ 2
Вы всегда можете использовать type=text
и display:none;
, так как Angular игнорирует скрытые элементы. Как говорит OP, обычно вы этого не делали, но это похоже на частный случай.
<input type="text" name="someData" ng-model="data" style="display: none;"/>
Ответ 3
В контроллере:
$scope.entityId = $routeParams.entityId;
В представлении:
<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />
Ответ 4
Я нашел хорошее решение, написанное Майком на sapiensworks. Это так же просто, как использование директивы, которая следит за изменениями в вашей модели:
.directive('ngUpdateHidden',function() {
return function(scope, el, attr) {
var model = attr['ngModel'];
scope.$watch(model, function(nv) {
el.val(nv);
});
};
})
а затем привяжите ввод:
<input type="hidden" name="item.Name" ng-model="item.Name" ng-update-hidden />
Но решение, предоставляемое tymeJV, может быть лучше, поскольку скрытый ввод не активирует событие изменения в javascript, так как yycorman сказал на этой почте, поэтому при изменении значения через плагин jQuery будет работать.
Edit
Я изменил директиву, чтобы применить новое значение к модели при запуске события изменения, поэтому оно будет работать как текст ввода.
.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());
});
});
}
};
})
поэтому, когда вы запускаете событие $("#yourInputHidden").trigger('change')
с jQuery, оно также обновляет связанную модель.
Ответ 5
Обнаружено странное поведение в отношении этого скрытого значения(), и мы не можем заставить его работать.
После игры мы обнаружили, что лучший способ - это просто определить значение в самом контроллере после области формы.
.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
}
}])
Ответ 6
Я достиг этого через -
<p style="display:none">{{user.role="store_user"}}</p>
Ответ 7
update @tymeJV ответ
например:
<div style="display: none">
<input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>" >
</div>
Ответ 8
У меня была одна и та же проблема,
Мне действительно нужно отправить ключ из jsp в java script,
Он проводит около 4 часов или более моего дня, чтобы решить эту проблему.
Я включаю этот тег в свой 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}. -->
Ответ 9
На всякий случай кто-то все еще борется с этим, у меня была схожая проблема при попытке отслеживать пользовательский сеанс /userid в многостраничной форме
Я установил, что добавив
.when( "/q2/: uid" в маршрутизации:
.when("/q2/:uid", {
templateUrl: "partials/q2.html",
controller: 'formController',
paramExample: uid
})
И добавил это как скрытое поле для передачи параметров между страницами webform
< < input type = "hidden" required ng-model = "formData.userid" ng-init = "formData.userid = uid" /" >
Я новичок в Angular, поэтому не уверен, что это лучшее возможное решение, но, похоже, теперь работает нормально для меня.
Ответ 10
Непосредственно присвойте значение модели в атрибуте data-ng-value
.
Поскольку интерпретатор Angular не распознает скрытые поля как часть ngModel.
<input type="hidden" name="pfuserid" data-ng-value="newPortfolio.UserId = data.Id"/>
Ответ 11
Я использую классический javascript для установки значения для скрытого ввода
$scope.SetPersonValue = function (PersonValue)
{
document.getElementById('TypeOfPerson').value = PersonValue;
if (PersonValue != 'person')
{
document.getElementById('Discount').checked = false;
$scope.isCollapsed = true;
}
else
{
$scope.isCollapsed = false;
}
}
Ответ 12
Ниже код будет работать для этого IFF в том же порядке, что и его упоминаемый
убедитесь, что вы заказываете имя типа, а затем ng-model ng-init, значение. thats It.