AngularJS不发送隐藏输入值

8 浏览
0 Comments

AngularJS不发送隐藏输入值

我正在尝试从我的AngularJS表单中获取数据,除了我没有在字段中输入任何内容外,其他都可以正常工作。我将该字段从隐藏更改为文本,但两者都不起作用,但是如果您检查元素,您可以看到其中的正确值。这是我的HTML代码:\n

a{{data.receiver.id}}a

\n这是我的控制器代码:\n

app.controller('postMessageCtrl', function ($scope, $http, $state, localStorageService) {
    $scope.formData = {
        key: localStorageService.get('userKey'),
        message: '',
        receiver: ''
    };
    console.log($scope.formData);
});

\n键和消息已正确填充,但接收者ID没有。有什么建议吗?

0
0 Comments

问题的原因是代码中出现了未定义的变量data,而formData中的receiver也没有包含id属性。解决方法是将代码中的data改为formData,并确保receiver包含id属性。可以参考以下代码:

避免通过在按钮点击时处理函数调用来提交表单,可以像在这个Plunk中一样使用一个按钮点击的函数调用来处理一切。

Html:

Messages
  • {{message}}

AngularJS Controller:

app.controller("postMessageCtrl", [
      "$scope",
      "$http",
      function($scope, $http){
        var self = {};
        $scope.messageInput = '';
        $scope.formData = {
            key: 'someUserKey',
            messages: [],
            receiver: {
              id: 1,
              name: 'SomeReceiver'
            }
        };
        $scope.Add = function(){
          console.log($scope.messageInput);
          if($scope.messageInput.length > 0) {
            $scope.formData.messages.push($scope.messageInput);
          }
        };
        $scope.Send = function() {
          console.log($scope.formData);
          $http.post("/somehost/action/", $scope.formData).success(function(data, status) {
            $scope.hello = data;
          });
        };
}]);

这样就不需要添加隐藏字段,因为它们是不需要的(你总是可以从$scope.Person中获取它们的值)。

结论:

从你的原始问题中有两个地方不太合理:

a{{data.receiver.id}}a

这里应该使用formData,data没有定义。

JSON格式不正确

receiver没有包含id属性,根据你的示例代码,应该这样定义:

$scope.formData = {
        key: localStorageService.get('userKey'),
        message: '',
        receiver: {
          id: 1,
          name: 'SomeReceiver'
        }
    };

所以如果你的接收者是这样设置的:

$scope.formData.receiver = $scope.formData.messages[0].receiver;

你需要找到一种方法通过messages[0]来提供接收者。

你会注意到控制台日志中,receiver成为了一个对象。

我完全按照你的例子进行了操作,但是现在它仍然显示隐藏字段为空。

a{{data.receiver.id}}a这个变量在屏幕上显示了,所以我确定我得到了正确的id。a{{data.receiver.id}}a <-- 这是我需要的id。

我知道,但它不起作用是因为data没有定义,参考我的答案。

这里是否定义了data?

  • 在你提供的控制器中,它没有定义。它只是不存在。

    让我们在聊天中继续这个讨论。

  • 0
    0 Comments

    问题的原因是在AngularJS中,隐藏的输入字段(type="hidden")默认情况下不会被发送到服务器。因此,如果在隐藏的输入字段中设置了ng-model指令,它的值将不会包含在表单数据中。

    解决方法是使用ngInit指令来初始化隐藏的输入字段的值。通过将ngInit指令添加到隐藏的输入字段中,并在ngInit指令中设置formData.receiver的值,可以确保该值在表单数据中被正确地发送到服务器。

    以下是解决方法的代码示例:

    
    

    在上述代码中,ngInit指令被添加到隐藏的输入字段中,并在ngInit指令中设置了formData.receiver的值为data.receiver.id。

    然而,上述代码可能会导致控制台显示receiver未定义的错误。这是因为data对象未在代码中初始化。

    解决此问题的方法是在ngRepeat指令中使用ngInit指令来初始化data对象。在ngRepeat指令中,可以将ngInit指令添加到

  • 元素中,并设置data.receiver的值为messages[0].sender。

    以下是解决方法的代码示例:

  • 在上述代码中,ngInit指令被添加到

  • 元素中,并在ngInit指令中设置了data.receiver的值为messages[0].sender。

    通过使用上述解决方法,可以确保隐藏的输入字段的值被正确地发送到服务器,并且不会导致控制台错误。

  • 0
    0 Comments

    在这个问题中,问题的原因是不能使用双向绑定(double binding)来处理隐藏字段(hidden field)。解决方法是使用方括号来实现绑定。

    从Angular 1.2版本开始,可以使用ng-value指令将表达式绑定到输入元素的value属性上。这个指令通常用于单选框(radio)或复选框(checkbox),但在隐藏字段上也能很好地工作。

    以下是使用ng-value的解决方法:

    
    

    另一种解决方法是在初始化时直接在$scope.formData中设置值,而不是使用隐藏字段:

    $scope.formData = {};
    //$scope.formData = localStorageService.get('userKey');
    $scope.formData = {
        key: localStorageService.get('userKey'),
        message: '',
        receiver: ''
    };
    $scope.formData.receiver = $scope.data.receiver.id;  // 直接在formData中设置值,因为你正在使用Angular;
    console.log($scope.formData);
    

    但是你在这里使用了ng-model和ng-value。请移除ng-model并再次尝试。

    好的,我们来退一步。你是如何填充$scope.data.receiver.id的值的?

    我只是将所有的数据都放在了$scope.formdata中,key是通过localstorageservice填充的,而message和receiver是通过表单填充的。

    问题在于这种方式不会将数据绑定到需要的模型上。此外,ngValue在没有ngModel的情况下是没有意义的。即使你添加了ngModel,它也不起作用,因为ngValue是用于单选按钮和选择框中的选项元素的。

    那个更新后的版本给我一个错误,无法读取未定义的id属性。

    我只是写了一个例子。我希望你在那里放入关于如何在HTML隐藏元素中获取实际值的实际代码。

    是的,这就是我在之前的评论中问过的,你是如何获取$scope.data.receiver.id的值的,然后你说你通过本地存储填充。我希望在控制器中从本地存储中获取值(正如我在控制器中提到的),而不是在HTML中进行操作。

    0