【问题标题】:Scope lost in ng-include and ng-submit does not submit form while ng-click does but without values of formng-include 和 ng-submit 中的范围丢失,而 ng-click 没有提交表单,但没有表单值
【发布时间】:2016-05-27 21:24:55
【问题描述】:

我第一次尝试使用 ng-include 和 ng-submit。我一直在尝试关注这个 SO 问题Why form undefined inside ng-include when checking $pristine or $setDirty()?。以下是我构建 index.html 的方式:

<div id="info" ">
   <div ng-include src="'standard.html'" ng-controller="FormController as formcontrol"> 
</div>
</div>

在我的standard.html中

<uib-accordion close-others="oneAtATime"> <uib-accordion-group
    heading="{{person.personID}}" ng-repeat="person in people.info">
<form name="formHolder.personForm>

    <div class ="form-group">
      <input type="text" name="name"
      class="form-control" 
      ng-model="person.name"
      ng-readonly="person.name">
    </div>

    ----------
  </form>
<button type="button" ng-submit="updateStatus(person.personID)"
    class="btn btn-success btn-lg btn-block">Update</button>

同样,我还有 20 个字段,其中只有 4 个是可编辑字段。一旦用户单击更新按钮,我想将所有表单数据放入 FormController 中进行的 ajax 调用。

在我的表单控制器中:

(function() {
    angular.module('peopleInfo2').controller('FormController', ['$http','$scope', function($http, $scope) {                 

        $scope.formHolder = {};
        $scope.updateStatus =function (personID) {
            console.log($scope.formHolder);
        };
    }]);        
})();

问题:

a) 使用 ng-submit 时不会调用表单,但使用 ng-click 时会调用。我已经阅读了他们之间的差异以及他们说我应该使用 ng-submit 的所有地方。我做错了什么?

b) 目前,如果我使用 ng-click,则 $scope.formHolder 中的数据是一个 personForm 对象,其中包含我的数据,所有数据都在 updateStatus 函数中以对象形式存在。为什么我不能像 deviceForm.personID 那样访问它们?为什么它会给我像 $modelValue 和 $viewValue 这样的值,而不仅仅是表单中绑定到 ng-model 的值?

c) 如果我使用 ng-click,那么无论何时提交表单。它只是从 person.info 数组的最后一个条目中获取值。这意味着无论如何,在尝试读取 ng-model 的值时,只能访问 ng-repeat 读取的最后一个值。为什么?

我将不胜感激。我很接近得到这个东西,但我想确保我理解正确,因为它将在整个项目中使用。我之前尝试使用自定义指令,但有人建议该方法不正确呈现 Web 表单,应使用 ng-include。谢谢。

【问题讨论】:

  • 把你的
  • 是的,这确实是问题所在。但是点击更新按钮时表单仍然没有得到更新的值。有什么建议吗?

标签: javascript html angularjs forms


【解决方案1】:

您的代码存在一些问题,但作为第一个问题,我认为您应该在表单标签上使用 ng-submit 指令。像这样:

<form name="{{formHolder.personForm}}" ng-submit="updateStatus(person.personID)">...</form>

在您的表单中使用&lt;input type="submit" class="btn btn-success btn-lg btn-block"/&gt; 作为提交按钮。

但是为什么不在表单中使用 ng-repeat 并将整个数组传递给提交函数呢?

【讨论】:

  • 我现在把它放在了&lt;input type="submit" class="btn btn-success btn-lg btn-block" value="Update"&gt; 的表单中,并用表单声明移动了ng-submit="updateStatus(person.personID)"。但是updateStatus 函数没有被触发。另外,请问表格名称"{{formHolder.personForm}}"使用表达式的原因吗?
  • @KavehG 我的错。我部署了错误的战争文件。这样可行。它触发updateStatus 函数。根据您的ng-repeat 问题,我想首先使用person in people.info 显示手风琴的标题。因此,每个标题都会展开,显示包含特定点击 personID 条目的表单。所以我认为我应该首先显示手风琴的标题,然后显示与该手风琴相关的表单。这是错误的想法或设计吗?此外,在触发 updateStatus 时,我仍然无法从表单中获取更新的值。
  • 它现在确实得到了更新的值。谢谢您的帮助。我坚持序列化表单值,但我想我可以尝试处理它并解决它。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多