AngularJS不发送隐藏字段值


192

对于特定的用例,我必须以“旧方式”提交单个表单。意思是,我使用带有action =“”的表单。响应已流式传输,因此我不会重新加载页面。我完全知道,典型的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>

如果我点击了提交,则没有值发送到服务器。如果我将输入字段更改为键入“文本”,它将按预期工作。我的假设是隐藏字段没有真正填充,而文本字段实际上是由于双向绑定而显示的。

有什么想法可以提交由AngularJS填充的隐藏字段吗?


4
嗯...输入文字怎么样display: none;?太丑了。Angular会忽略隐藏的元素。
tymeJV 2013年

把它作为答案@tymeJV!
Jeroen Ingelbrecht

7
我使用以下语法绑定值:<input type="hidden" required ng-model="data.userid" ng-init="data.userid=pivot.id" /> 。这可能不是正确的做法,但对我有用。
约翰·P

Answers:


287

您不能对隐藏字段使用双重绑定。解决方案是使用方括号:

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

编辑:在github上查看此线程:https : //github.com/angular/angular.js/pull/2574

编辑:

从Angular 1.2开始,您可以使用'ng-value'指令将表达式绑定到input的value属性。该指令应与输入单选框或复选框一起使用,但与隐藏的输入配合使用。

这是使用ng-value的解决方案:

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

这是一个使用ng-value和隐藏输入的小提琴:http : //jsfiddle.net/6SD9N


太棒了 非常感谢。我几乎要隐藏文本字段,但是现在我觉得这是个不错的解决方法。
基督教徒

22
大。另外,您也可以使用ng-value =“ modelName”而不使用方括号。
2014年

2
没错,自Angular 1.2起,您可以使用ng-value将表达式绑定到value属性,答案是最新的。
米凯尔(Mickael)2014年

使用AngularJS时真的需要隐藏字段吗?在ngSubmit上,您击中一个控制器,所有数据都是完全可见的,可以通过$ http服务发送。
mtpultz

3
非常感谢。ng-model不能用于隐藏输入的事实应在AngularJS IMO中进行记录。
yoonchee'1

47

您可以始终使用type=text和,display:none;因为Angular会忽略隐藏的元素。正如OP所说,通常您不会这样做,但这似乎是一种特殊情况。

<input type="text" name="someData" ng-model="data" style="display: none;"/>

谢谢!我朝同一方向思考,但我只需要更喜欢Mickael的{{}}解决方案。
基督教徒

1
聪明/聪明的解决方案
ImranNaqvi '16

8

在控制器中:

$scope.entityId = $routeParams.entityId;

在视图中:

<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />

1
好点……我宁愿下次仅在控制器中执行此操作
meffect

我爱上了ng-init
ImranNaqvi

不。循环会很麻烦,entityId如果entityId是数组
则会

4

我发现了Mike在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提供的解决方案可能更好,因为yycorman在这篇文章中告诉隐藏的输入不会触发javascript中的change事件,因此,通过jQuery插件更改值时仍然可以使用。

编辑 我更改了指令,以在触发更改事件时将新值应用回模型,因此它将用作输入文本。

.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 触发事件时,它也会同时更新绑定的模型。


还有其他人在使该解决方案生效时遇到困难吗?问题是解析和执行指令时ngModel参数未定义,因此不会添加$ watch。
icfantv

好。似乎问题在于第四个参数ngModel是一个对象,而在sapiensworks链接中引用的示例通过attr ['ngModel']检索ng-model属性的字符串值,然后将其传递给手表。我可以确认进行此更改可以解决手表问题。
icfantv

这里还有另一个问题。当您以编程方式更改隐藏输入字段的值时,jQuery不会触发更改事件。因此,如果我说$(hidden_​​input_elt).val(“ snoopy”),我还必须添加.change()来引发更改事件。问题是,Angular会抱怨上面的$ scope.apply(),因为它已经在$ apply中了。解决方案是在上面的change函数中删除$ scope。$ apply,然后调用ngModel。$ setViewValue(...)。
icfantv 2014年

2

发现了有关此隐藏值()的奇怪行为,我们无法使其正常工作。

经过反复试验,我们发现最好的方法是在窗体范围之后在控制器本身中定义值。

.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 
}

}])

1

我是通过以下方式实现的:

 <p style="display:none">{{user.role="store_user"}}</p>

1

更新@tymeJV的答案,例如:

 <div style="display: none">
    <input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>" >
 </div>

0

我曾经遇到过同样的问题,我确实需要将密钥从我的jsp发送到Java脚本,每天花费大约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}. -->

结果是:Portfólio1 criado com sucesso!ID = 3。

最好的祝福


0

万一有人仍在为此挣扎,尝试在多页表单上跟踪用户会话/用户ID时遇到类似问题

我已经通过添加来解决

.when(“ / q2 /:uid”在路由中:

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

并将其添加为隐藏字段以在Webform页面之间传递参数

<<输入类型=“ hidden”必需ng-model =“ formData.userid” ng-init =“ formData.userid = uid” />

我是Angular的新手,所以不确定它是否是最佳解决方案,但现在看来对我来说还可以


0

直接将值分配给data-ng-value属性中的模型。由于Angular解释器无法将隐藏字段识别为ngModel的一部分。

<input type="hidden" name="pfuserid" data-ng-value="newPortfolio.UserId = data.Id"/>

0

我使用经典的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;
    }
}


0

在这里,我想分享我的工作代码:

<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"/>


请您进一步说明一下
-JSmith

当然!当我们使用具有display:none属性的隐藏字段或文本字段时,用户将无法输入值。在这种情况下,ng-init指令有助于设置字段的值。谢谢
J. Middya '18

在帖子中,我的意思是对不起
JSmith '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.