【问题标题】:AngularJs - submit the form programmaticallyAngularJs - 以编程方式提交表单
【发布时间】:2019-03-29 20:35:22
【问题描述】:

我阅读了有关此主题的几个答案,但它们似乎不适用于我的问题。我的问题很复杂。我有一个使用 ReportViewer.ASPX 的表单。形式定义如下:

<form name="form" novalidate role="form"
          sm-dirty-check
          id="reportViewer"
          method="post"
          action="~/Infrastructure/ReportViewer/reportViewer.aspx"
          target="viewerIFrame"          
          ng-show="crud.showForm" class="ng-cloak">

       @* Form inputs *@
        <input type="hidden" name="labelType" value="Rental" />
        <input type="hidden" name="labelLayoutId" value="{{ crud.model.lbLayoutId }}" />
        <input type="hidden" name="itemsToPrint" value="{{ crud.jsItemsToPrint }}" />

实际表单是使用 ng-form 在选项卡中定义的(我只分享了与我的问题相关的编辑表单的顶部)。

我在表单底部也有这些按钮:

    <button type="submit"
            ng-if="crud.model.lbLayoutId!==0"
            name="generateLabelButton"
            id="generateLabelButton"
            class="btn btn-primary pull-left"
            ng-click="crud.generateLabel()"
            ng-disabled="crud.isSaveButtonDisabled">
        @Labels.generateLabel
    </button>
    <div class="pull-left generateLabelButton">
        <data-desc:type ng-if="crud.model.lbLayoutId===0"
                        value="@Labels.generateLabel"
                        keep-pristine="true"
                        on-after-selection="crud.layoutSelected(selectedValue)"
                        title="{{ '@string.Format(Labels.selectX, Labels.labelLayout)'}}"
                        param="layouts"
                        message="@string.Format(Labels.selectX, Labels.labelLayout)"
                        selected="crud.model.lbLayoutId"
                        descrip-value="descrip"
                        id="layoutPickerButton"
                        name="layoutPickerButton"
                        button-type="button"
                        type="7"
                        filter-by="Label"
                        description="crud.model.lbLayout">
        </data-desc:type>
    </div>

所以,如果我定义了 lblLayoutId,我有我的常规提交按钮,我按下它并提交我的表单,一切都很好。

如果我没有定义 lblLayoutId(它是 0),我需要使用一个具有按钮模板的指令,当我按下它时,它会打开一个模式表单来选择布局等。

所以,我的问题是,在我选择了布局之后,我需要提交我的表单,这样标签才能出现。

我尝试将指令设置为提交类型(按钮类型属性),但没有成功。

我还在选择值时按钮执行的方法中尝试了以下代码:

rentalEquipmentsCrudController.prototype.layoutSelected = function (selectedValue) {
    this.model.lbLayoutId = selectedValue;
    $("#generateLabelButton").click();        
}
rentalEquipmentsCrudController.prototype.generateLabel = function () {
    if (this.model.lbLayoutId === 0) return;
    this.jsItemsToPrint = "";
    this.itemsToPrint = this.getItemsToPrint();

    this.jsItemsToPrint = JSON.stringify(this.itemsToPrint);


    angular.element($("#viewerIFrame").contents()
      .find("#reportViewer_ReportViewer")).empty();
    let actionPath = angular.element($("#reportViewer")).attr("action");
    if (actionPath.slice(-3) !== "pdf") actionPath += "/Labels.pdf";

    angular.element($("#reportViewer")).attr("action", actionPath);
    this.showViewer = true;

};

layoutSelected 方法由我的指令执行,下一个代码由我的常规按钮执行。

所以,我不知道如何让它发挥作用。

【问题讨论】:

    标签: javascript jquery html angularjs


    【解决方案1】:

    表单在客户端 AngularJS 应用程序中的作用与经典往返应用程序不同,浏览器最好不要将表单提交转换为整个页面的重新加载。而是发布 JSON 数据并接收 JSON 数据响应。去服务器获取数据,而不是 html/js/css 等。

    阅读AngularJS &lt;form&gt; Directive API Reference - Submitting a form and preventing the default action

    【讨论】:

    • 是的,这个周末我在想,我必须重新设计报告(标签)数据的返回方式。那个 ASPX 代码实际上不是我的,我试图让它像在其他地方一样工作,但我意识到我确实需要改变这种方法。
    【解决方案2】:

    您不想将ng-clicktype="submit" 按钮组合在一起,这仍会导致表单提交(非编程方式)。相反,请使用type="button"。或者,您可以保留type="submit",但将ng-submit="crud.generateLabel()" 添加到表单元素

    <form>
      ...
      <button type="button" ng-click="crud.generateLabel()">...</button>
    </form>
    

    或者:

    <form ng-submit="crud.generateLabel()">
      ...
      <button type="submit">...</button>
    </form>
    

    【讨论】:

    • 我明白了,对于我的普通按钮,你建议甚至没有代码,但在 ng-submit 中有它 - 让我试试。我仍然不确定它是否适用于需要执行选择器代码然后我的表单需要提交的指令。
    • 所以,您的建议确实适用于我的提交按钮。不幸的是,我仍然不确定我需要对我的指令做什么。我是否也需要尝试将其用作按钮式提交?如果是,在该指令确实调用其模态表单并返回结果之前需要做些什么来避免表单提交(该指令具有 ng-click = "click()" 并且 click 是作用域上的一个方法
    • 所以问题是 - 有没有办法防止表单提交在某些情况下触发?
    • 我认为我真正的问题是 - 有没有更好的方法来调用这个方法="post" action="~/Infrastructure/ReportViewer/reportViewer.aspx" target="viewerIFrame" [例如而不是使用这种旧式代码可能只是使用 http.post 来代替,但是却以某种方式将其重新定向到框架?]
    猜你喜欢
    • 2017-08-03
    • 2014-07-11
    • 2010-11-22
    • 2018-06-13
    • 2015-02-25
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多