对于特定的用例,我必须以“旧方式”提交一个表单。意思是,我使用带有 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 填充的隐藏字段吗?
display: none;
?太丑了。 Angular 忽略隐藏元素。
<input type="hidden" required ng-model="data.userid" ng-init="data.userid=pivot.id" />
。这可能不是正确的做法,但对我有用。
您不能对隐藏字段使用双重绑定。解决方案是使用括号:
<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
您始终可以使用 type=text
和 display:none;
,因为 Angular 会忽略隐藏元素。正如 OP 所说,通常你不会这样做,但这似乎是一个特例。
<input type="text" name="someData" ng-model="data" style="display: none;"/>
在控制器中:
$scope.entityId = $routeParams.entityId;
在视图中:
<input type="hidden" name="entityId" ng-model="entity.entityId" ng-init="entity.entityId = entityId" />
entityId
是一个数组,则将最后一个值分配给所有 entityId
我找到了 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 在 this 帖子中所说的那样,隐藏的输入不会触发 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());
});
});
}
};
})
所以当你用 jQuery 触发 $("#yourInputHidden").trigger('change')
事件时,它也会更新绑定的模型。
发现有关此隐藏值 () 的奇怪行为,我们无法使其工作。
在玩了之后,我们发现最好的方法是在表单范围之后定义控制器本身的值。
.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
}
}])
我通过 -
<p style="display:none">{{user.role="store_user"}}</p>
更新@tymeJV 的答案,例如:
<div style="display: none">
<input type="text" name='price' ng-model="price" ng-init="price = <%= @product.price.to_s %>" >
</div>
我遇到了同样的问题,我真的需要从我的 jsp 发送一个密钥到 java 脚本,它花了我一天大约 4 小时或更长时间来解决它。
我在我的 JavaScript/JSP 中包含了这个标签:
$scope.sucessMessage = function (){ var message = ($scope.messages.sucess).format($scope.portfolio.name,$scope.portfolio.id); $scope.inforMessage = 消息;警报(消息); } String.prototype.format = function() { var formatted = this; for( var arg in arguments ) { formatted = formatted.replace("{" + arg + "}", arguments[arg]); } 返回格式化; }; < !-- 插入后显示的消息 -->
结果是:投资组合 1 criado com sucesso! ID=3。
此致
以防万一有人仍然为此苦苦挣扎,我在尝试跟踪多页表单上的用户会话/用户 ID 时遇到了类似的问题
我已经通过添加解决了这个问题
.when("/q2/:uid" 在路由中:
.when("/q2/:uid", {
templateUrl: "partials/q2.html",
controller: 'formController',
paramExample: uid
})
并将其添加为隐藏字段以在 web 表单页面之间传递参数
<< input type="hidden" 需要 ng-model="formData.userid" ng-init="formData.userid=uid" />
我是 Angular 的新手,所以不确定它是否是最好的解决方案,但它现在对我来说似乎没问题
直接将值分配给 data-ng-value
属性中的模型。由于 Angular 解释器不将隐藏字段识别为 ngModel 的一部分。
<input type="hidden" name="pfuserid" data-ng-value="newPortfolio.UserId = data.Id"/>
我使用经典的 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;
}
}
下面的代码将适用于此 IFF,其顺序与提及的顺序相同,请确保您订购的是类型,然后是名称、ng-model ng-init、值。而已。
在这里我想分享我的工作代码:
或 或