AngularJS 不发送隐藏字段值

IT技术 javascript forms angularjs
2021-02-03 00:36:25

对于特定用例,我必须以“旧方式”提交单个表单。意思是,我使用带有 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 填充的隐藏字段?

6个回答

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

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

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

编辑:

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

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

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

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

非常感谢。AngularJS IMO 中应记录 ng-model 不能用于隐藏输入的事实。
2021-03-15 00:36:25
没错,从 Angular 1.2 开始,您可以使用 ng-value 将表达式绑定到 value 属性,答案是最新的。
2021-03-24 00:36:25
惊人的。非常感谢。我几乎要隐藏文本字段,但现在我觉得这是一个很好的解决方法。
2021-03-29 00:36:25
伟大的。而且你也可以使用 ng-value="modelName" 来做没有括号。
2021-04-04 00:36:25
当您使用 AngularJS 时,您真的不再需要隐藏字段了吗?在 ngSubmit 上,你点击了一个控制器,你的所有数据都是完全可见的,可以通过一些 $http 服务发送。
2021-04-13 00:36:25

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

<input type="text" name="someData" ng-model="data" style="display: none;"/>
谢谢!我的想法与此相同,但我不得不更喜欢 Mickael 的 {{}} 解决方案。
2021-03-14 00:36:25
聪明/聪明的解决方案
2021-03-21 00:36:25

在控制器中:

$scope.entityId = $routeParams.entityId;

在视图中:

<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />
我爱上了 ng-init
2021-03-31 00:36:25
不。在循环中它会带来很多麻烦并将最后一个值分配给所有entityIdifentityId是一个数组
2021-04-05 00:36:25
好点......下次我宁愿只在控制器中这样做
2021-04-10 00:36:25

我在sapiensworks上找到了 Mike 写的一个很好的解决方案它就像使用一个指令来监视模型的变化一样简单:

.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 中触发更改事件,因此当通过 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 。
2021-03-15 00:36:25
这里还有一个问题。当您以编程方式更改隐藏输入字段的值时,jQuery 不会触发更改事件。因此,如果我说 $(hidden_​​input_elt).val("snoopy") 我还必须添加 .change() 以触发更改事件。这样做的问题是 Angular 会抱怨上面的 $scope.apply() 因为它已经在 $apply 正在进行中。这里的解决方案是删除上面更改函数中的 $scope.$apply 并调用 ngModel.$setViewValue(...)。
2021-03-23 00:36:25
行。问题似乎是第四个参数 ngModel 是一个对象,而从 sapiensworks 的链接引用的示例通过 attr['ngModel'] 检索 ng-model 属性的字符串值,然后将其传递给手表。我可以确认进行此更改可以解决手表问题。
2021-04-05 00:36:25

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

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

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

}])