【问题标题】:Pass polymer form data to rest api将聚合物形式数据传递给rest api
【发布时间】:2014-10-09 06:50:06
【问题描述】:

我正在寻找某种方法将数据从 Polymer 表单字段传递到 REST API, 实际上,我正在使用 core-ajax 来执行此操作,但我认为执行此操作的方法有点繁重。

有什么标准的方法吗?

这是我的代码:

<template>
<section>
    <file-input class="blue" id="file" extensions='[ "xls" ]' maxFiles="1">{{ FileInputLabel }}</file-input>
</section>
<section>
    <paper-button raised class="blue" disabled?="{{ (! Validated) || (Submitted) }}" on-tap="{{ Submit }}">
    <core-icon icon="send"></core-icon> 
             Process
    </paper-button>
</section>

<paper-toast id="toast" text=""></paper-toast>

<core-ajax id="ajax" url="/import-pdi" method="POST" handleAs="json" response="{{ response }}" on-core-complete="{{ SubmitFinished }}"></core-ajax>
</template>

    <script>
        Polymer("import-pdi-form", {

            Validated: false,
            Submitted: false,

            FileInputLabel: "SELECT",
            ready: function () {
                this.shadowRoot.querySelector("#file").addEventListener("change", function(event) {
                    var container = document.querySelector("import-pdi-form");
                    container.Validated = (event.detail.valid.length != 0);
                    if (event.detail.valid.length == 0) {
                        container.shadowRoot.querySelector("#toast").text = "Invalid Format";
                        container.shadowRoot.querySelector("#toast").show();
                        container.FileInputLabel = "SELECCIONA L'ARXIU";
                    }
                    else {
                        container.FileInputLabel = event.detail.valid[0].name;
                        var form_data = new FormData();
                        form_data.append("file", event.detail.valid[0], event.detail.valid[0].name);
                        container.shadowRoot.querySelector("#ajax").body = form_data;
                        container.shadowRoot.querySelector("#ajax").contentType = null;
                    }
                });
            },
            Submit: function() {
                if ((this.Validated) && (! this.Submitted)) {
                    this.Submitted = true;
                    this.shadowRoot.querySelector("#ajax").go();
                }
            },
            SubmitFinished: function(event, detail, sender) {
                if (detail.xhr.status == 200) {
                    this.shadowRoot.querySelector("#toast").text = JSON.parse(detail.xhr.response).message;
                }
                else {
                    this.shadowRoot.querySelector("#toast").text = "Server Error";
                }
                this.shadowRoot.querySelector("#toast").show();
                this.FileInputLabel = "SELECCIONA L'ARXIU";
                this.shadowRoot.querySelector("#file").reset();
                this.Submitted = false;
            }
        });
     </script>

【问题讨论】:

  • 我注意到在很多地方你都在使用 this.shadowRoot.querySelector 来获取带有 id 的东西。您可以使用自动节点查找来更有效地做到这一点polymer-project.org/docs/polymer/…
  • @robdodson:感谢您的建议。我刚刚更改了 shadowRoot 并且一切运行良好。除此之外,我正在寻找将表单数据传递给服务器的最佳方式。现在我正在使用 core-ajax ,但它似乎有点重的解决方案。有什么标准吗?

标签: forms rest polymer


【解决方案1】:

对于提交包含自定义元素的表单,我们目前建议您使用ajax-form element。看起来您可能已经在使用同一作者的 file-input 元素,因此两者应该可以很好地协同工作。

【讨论】:

  • @AlbertHornos 如果我是对的,core-input 和 paper-input 的最新更新使得在不使用 ajax-form 的情况下提交表单,但仍保留材料设计的风格并通过传统方式发布,如果我理解正确。查看更改日志:blog.polymer-project.org/releases/2014/11/12/release-0.5.1/…
  • @Rexford 这似乎不正确。 “ 元素不在
    元素内提交 - 最佳实践是使用 和更现代的 XHR 方法来提交数据,例如使用 元素”。该声明也适用于其他自定义元素表单字段。
  • @RayNicholus 是的,你说得对。除非使用 ajax-form,否则纸张输入不起作用。但是如果想要普通输入的纸质输入设计,那么输入标签可以包装在纸质输入装饰器中,当表单正常提交时会起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多