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.