关于javascript:AngularJS不发送隐藏字段值

AngularJS does not send hidden field value

对于特定用例,我必须以"旧方式"提交单个表单。 意思是,我使用带有action ="的表单。响应是流式传输的,所以我没有重新加载页面。我完全知道一个典型的AngularJS应用程序不会以这种方式提交表单,但到目前为止我别无选择。

也就是说,我试图从Angular填充一些隐藏的字段:

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

请注意,显示数据中的正确值。

表单看起来像标准形式:

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

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

有关如何提交由AngularJS填充的隐藏字段的任何想法?


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

1
<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值的解决方案:

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

这是一个使用带有隐藏输入的ng值的小提琴:http://jsfiddle.net/6SD9N


您始终可以使用type=textdisplay:none;,因为Angular会忽略隐藏的元素。正如OP所说,通常你不会这样做,但这似乎是一个特例。

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


在控制器中:

1
$scope.entityId = $routeParams.entityId;

在视图中:

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


我找到了迈克在sapiensworks上写的一个很好的解决方案。它就像使用监视模型更改的指令一样简单:

1
2
3
4
5
6
7
8
.directive('ngUpdateHidden',function() {
    return function(scope, el, attr) {
        var model = attr['ngModel'];
        scope.$watch(model, function(nv) {
            el.val(nv);
        });
    };
})

然后绑定您的输入:

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

但是tymeJV提供的解决方案可能会更好,因为yycorman在这篇文章中告诉你隐藏的输入不会触发javascript中的更改事件,所以当通过jQuery插件更改值时仍然可以工作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.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());
                });
            });
        }
    };
})

因此,当您使用jQuery触发$("#yourInputHidden").trigger('change')事件时,它也会更新绑定模型。


发现了一个关于这个隐藏值()的奇怪行为,我们无法使它工作。

在玩完之后我们发现最好的方法就是在表单范围之后定义控制器本身的值。

1
2
3
4
5
6
7
8
9
10
11
.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
}

}])

更新@tymeJV的回答
例如:

1
    <input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>">


我通过以下方式实现了

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

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

1
2
3
4
5
<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"/>


以下代码适用于此IFF,其顺序与其提及的顺序相同
确保你的订单是类型,然后是名称,ng-model ng-init,value。而已。


我使用经典的javascript来设置隐藏输入的值

1
2
3
4
5
6
7
8
9
10
11
12
13
$scope.SetPersonValue = function (PersonValue)
{
    document.getElementById('TypeOfPerson').value = PersonValue;
    if (PersonValue != 'person')
    {
        document.getElementById('Discount').checked = false;
        $scope.isCollapsed = true;
    }
    else
    {
        $scope.isCollapsed = false;
    }
}

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

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


万一有人仍在努力解决这个问题,我在尝试跟踪多用户表单上的用户会话/用户ID时遇到了类似的问题

我通过添加修复了这个问题

.when(路由中的"/ q2 /:uid":

1
2
3
4
5
    .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的新手,所以不确定它是最好的解决方案,但它现在似乎对我有用


我遇到了同样的问题,
我真的需要从我的jsp发送密钥到java脚本,
它花了大约4小时或更多的时间来解决它。

我在我的JavaScript / JSP上包含这个标记:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 $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;
};
1
2
3
4
5
6
7
8
9
10
<!-- Messages definition -->
<input type="hidden"  name="sucess"   ng-init="messages.sucess='<fmt:message  key='portfolio.create.sucessMessage' />'">

<!-- Message showed affter insert -->
 0)">
    {{inforMessage}}


<!-- properties
  portfolio.create.sucessMessage=Portf\u00f3lio {0} criado com sucesso! ID={1}. -->

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

最好的祝福