AngularJS không gửi giá trị trường ẩn


192

Đối với một trường hợp sử dụng cụ thể, tôi phải gửi một mẫu đơn "cách cũ". Có nghĩa là, tôi sử dụng một hình thức với hành động = "". Phản hồi được truyền phát, vì vậy tôi không tải lại trang. Tôi hoàn toàn biết rằng một ứng dụng AngularJS điển hình sẽ không gửi biểu mẫu theo cách đó, nhưng cho đến nay tôi không có lựa chọn nào khác.

Điều đó nói rằng, tôi đã cố gắng điền vào một số trường ẩn từ Angular:

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

Xin lưu ý, giá trị chính xác trong dữ liệu được hiển thị.

Biểu mẫu trông giống như một hình thức tiêu chuẩn:

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

Nếu tôi nhấn gửi, không có giá trị nào được gửi đến máy chủ. Nếu tôi thay đổi trường đầu vào để gõ "văn bản" thì nó hoạt động như mong đợi. Giả định của tôi là trường ẩn không thực sự được điền, trong khi trường văn bản thực sự được hiển thị do ràng buộc hai chiều.

Bất kỳ ý tưởng nào làm thế nào tôi có thể gửi một trường ẩn được điền bởi AngularJS?


4
Hmm ... làm thế nào về văn bản , display: none;? Thật xấu xí tho. Angular bỏ qua các yếu tố ẩn.
tymeJV

đặt đó là câu trả lời @tymeJV!
Jeroen Ingelbrecht

7
Tôi sử dụng cú pháp sau để liên kết một giá trị : <input type="hidden" required ng-model="data.userid" ng-init="data.userid=pivot.id" /> . Đây có thể không phải là cách làm đúng đắn nhưng nó hiệu quả với tôi.
John P

Câu trả lời:


287

Bạn không thể sử dụng liên kết đôi với trường ẩn. Giải pháp là sử dụng dấu ngoặc:

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

EDIT: Xem chủ đề này trên github: https://github.com/angular/angular.js/pull/2574

BIÊN TẬP:

Kể từ Angular 1.2, bạn có thể sử dụng chỉ thị 'ng-value' để liên kết một biểu thức với thuộc tính value của đầu vào. Lệnh này nên được sử dụng với radio đầu vào hoặc hộp kiểm nhưng hoạt động tốt với đầu vào ẩn.

Đây là giải pháp sử dụng ng-value:

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

Đây là một fiddle sử dụng ng-value với một đầu vào ẩn: http://jsfiddle.net/6SD9N


Tuyệt vời. Cảm ơn rất nhiều. Tôi gần như đã đi với việc ẩn trường văn bản, nhưng bây giờ tôi cảm thấy đây là cách giải quyết tuyệt vời.
Christian

22
Tuyệt quá. Và bạn cũng có thể sử dụng ng-value = "modelName" để làm điều đó mà không cần ngoặc.
Jonathan

2
Đúng vậy, kể từ Angular 1.2, bạn có thể sử dụng ng-value để liên kết một biểu thức với thuộc tính value, câu trả lời được cập nhật.
Mickael

Bạn có thực sự cần một trường ẩn nữa khi bạn sử dụng AngularJS không? trên ngSubmit bạn nhấn bộ điều khiển, tất cả dữ liệu của bạn hoàn toàn hiển thị để truy cập và bạn gửi tất cả thông qua dịch vụ $ http.
mtpultz

3
Cảm ơn rất nhiều. Thực tế là mô hình ng không thể được sử dụng cho đầu vào ẩn phải được ghi lại trong AngularJS IMO.
yoonchee

47

Bạn luôn có thể sử dụng một type=textdisplay:none;vì Angular bỏ qua các yếu tố ẩn. Như OP nói, thông thường bạn sẽ không làm điều này, nhưng đây có vẻ là một trường hợp đặc biệt.

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

Cảm ơn! Tôi đã nghĩ theo cùng một hướng, nhưng đơn giản là tôi phải thích Giải pháp {{}} từ Mickael.
Christian

1
giải pháp thông minh / thông minh
ImranNaqvi

8

Trong bộ điều khiển:

$scope.entityId = $routeParams.entityId;

Theo quan điểm:

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

1
Điểm hay ... Tôi chỉ muốn làm điều này trong bộ điều khiển vào lần tới
meffect

Tôi đang yêu ng-init
ImranNaqvi

Không. trong vòng lặp, nó gây ra nhiều rắc rối và gán giá trị cuối cùng cho tất cả entityIdnếu entityIdlà một mảng
ImranNaqvi

4

Tôi đã tìm thấy một giải pháp hay được viết bởi Mike trên sapiensworks . Nó đơn giản như việc sử dụng một lệnh theo dõi các thay đổi trên mô hình của bạn:

.directive('ngUpdateHidden',function() {
    return function(scope, el, attr) {
        var model = attr['ngModel'];
        scope.$watch(model, function(nv) {
            el.val(nv);
        });
    };
})

và sau đó ràng buộc đầu vào của bạn:

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

Nhưng giải pháp được cung cấp bởi tymeJV có thể tốt hơn vì đầu vào ẩn không xảy ra sự kiện thay đổi lửa trong javascript như yycorman đã nói trên bài đăng này , vì vậy khi thay đổi giá trị thông qua plugin jQuery vẫn sẽ hoạt động.

Chỉnh sửa Tôi đã thay đổi chỉ thị để áp dụng giá trị mới cho mô hình khi sự kiện thay đổi được kích hoạt, do đó, nó sẽ hoạt động như một văn bản đầu vào.

.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());
                });
            });
        }
    };
})

Vì vậy, khi bạn kích hoạt $("#yourInputHidden").trigger('change')sự kiện với jQuery, nó cũng sẽ cập nhật mô hình được liên kết.


Có ai khác gặp khó khăn khi giải pháp này để làm việc? Vấn đề là tham số ngModel không được xác định khi lệnh được phân tích cú pháp và được thực thi, do đó, đồng hồ $ không được thêm vào.
icfantv

Đồng ý. Có vẻ như vấn đề là tham số thứ tư ngModel là một đối tượng, trong khi ví dụ được tham chiếu từ liên kết tại sapiensworks lấy giá trị chuỗi của thuộc tính ng-model thông qua attr ['ngModel'] và sau đó chuyển nó vào đồng hồ. Tôi có thể xác nhận rằng thực hiện thay đổi này khắc phục sự cố đồng hồ.
icfantv

Có một vấn đề khác ở đây. jQuery không kích hoạt sự kiện thay đổi khi bạn lập trình thay đổi giá trị của trường nhập liệu bị ẩn. Vì vậy, nếu tôi nói $ (hidden_input_elt) .val ("snoopy") tôi cũng phải thêm .change () để khiến sự kiện thay đổi được kích hoạt. Vấn đề với điều này là Angular sẽ phàn nàn về $ scope.apply () ở trên vì nó đã được áp dụng $ đang được tiến hành. Giải pháp ở đây là loại bỏ $ scope. $ Áp dụng trong hàm thay đổi ở trên và chỉ cần gọi ngModel. $ SetViewValue (...).
icfantv

2

Tìm thấy một hành vi kỳ lạ về giá trị ẩn này () và chúng tôi không thể làm cho nó hoạt động.

Sau khi chơi xung quanh, chúng tôi thấy cách tốt nhất là xác định giá trị trong chính bộ điều khiển sau phạm vi biểu mẫu.

.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

Tôi đã đạt được điều này thông qua -

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

1

cập nhật câu trả lời của @tymeJV, vd:

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

0

Tôi đã phải đối mặt với cùng một vấn đề, tôi thực sự cần phải gửi một khóa từ jsp của tôi đến tập lệnh java, Nó mất khoảng 4h hoặc hơn trong ngày của tôi để giải quyết nó.

Tôi bao gồm thẻ này trên JavaScript / JSP của mình:

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

Kết quả là: Portfólio 1 criado com sucesso! ID = 3.

Trân trọng


0

Chỉ trong trường hợp ai đó vẫn vật lộn với điều này, tôi đã gặp vấn đề tương tự khi cố gắng theo dõi phiên người dùng / userid ở dạng nhiều trang

Ive đã sửa nó bằng cách thêm

.when ("/ q2 /: uid" trong định tuyến:

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

Và thêm nó dưới dạng một trường ẩn để chuyển thông số giữa các trang webform

<< input type = "hidden" bắt buộc ng-model = "formData.userid" ng-init = "formData.userid = uid" />

Tôi mới sử dụng Angular nên không chắc là giải pháp tốt nhất có thể nhưng hiện tại nó hoạt động tốt với tôi


0

Trực tiếp gán giá trị cho mô hình trong data-ng-valuethuộc tính. Vì trình thông dịch Angular không nhận ra các trường ẩn là một phần của ngModel.

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

0

Tôi sử dụng một javascript cổ điển để đặt giá trị thành đầu vào ẩn

$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

Dưới đây Mã sẽ hoạt động cho IFF này theo thứ tự như đã đề cập, đảm bảo rằng bạn đặt hàng là loại rồi tên, ng-model ng-init, value. đó là nó.


0

Ở đây tôi muốn chia sẻ mã làm việc của tôi:

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


bạn có thể giải thích thêm được không
JSmith

Chắc chắn rồi! Khi chúng tôi sử dụng trường ẩn hoặc trường văn bản có hiển thị: không thuộc tính, người dùng không thể nhập giá trị. Trong trường hợp đó, lệnh ng-init giúp đặt giá trị cho trường. Cảm ơn
J. Middya

trong bài viết tôi có nghĩa là Xin lỗi
JSmith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.