Polymer 2 access文件已上载到另一页

Polymer 2 access文件已上载到另一页,polymer,polymer-2.x,shadow-dom,Polymer,Polymer 2.x,Shadow Dom,我使用的是一个简单的聚合物应用程序,只有几页是铁皮的。我在一个页面上传一个文件,然后我想在另一个页面访问这个上传的文件 我尝试了几种方法,但似乎没有任何效果,下面是示例代码 上载文件的页面 有人能帮我一下吗?我在其他页面中访问此文件有什么问题?我如何在Polymer 2.0中处理此情况?正如您在消费者页面中所说,您正在尝试访问另一个组件的子元素sampleFileInput元素 所有这些尝试: var temp2 = this.$.sampleFileInput; var temp3 = thi

我使用的是一个简单的聚合物应用程序,只有几页是铁皮的。我在一个页面上传一个文件,然后我想在另一个页面访问这个上传的文件

我尝试了几种方法,但似乎没有任何效果,下面是示例代码

上载文件的页面

有人能帮我一下吗?我在其他页面中访问此文件有什么问题?我如何在Polymer 2.0中处理此情况?

正如您在消费者页面中所说,您正在尝试访问另一个组件的子元素sampleFileInput元素

所有这些尝试:

var temp2 = this.$.sampleFileInput;
var temp3 = this.shadowRoot.querySelector("#sampleFileInput"); 
var temp4 = this.root.querySelector('#sampleFileInput');
var temp5 = this.$$('#sampleFileInput');
var test1 = Polymer.dom(this).querySelector("#sampleFileInput");
失败,因为您正在尝试访问消费者页面模板中不存在的元素,而这些元素:

var test7 = document.querySelector('sampleFileInput');
var test8 = document.querySelector('file-upload-page::shadow .FileUploadPage');
分别失败,因为document.querySelector无法在shadow dom内部进行选择,并且不推荐使用::shadow和/deep/selector

从技术上讲,您应该能够通过以下方式在消费者页面内选择sampleFileInput:

this.parentElement // Goes back to iron-pages
    .querySelector('file-upload-page') // Selects file-upload-page
    .shadowRoot // Enters its shadow root
    .querySelector('#sampleFileInput'); // Selects the file uploader
然而,访问其他人的影子根目录中的元素被认为是一个挑战,更不用说,如果您对iron页面使用延迟加载,那么如果没有加载文件上载页面,这将失败

相反,有许多其他方法可以在自定义元素(如事件或属性)之外公开信息。 如果它适合您的实现,您可以使用包含iron页面的组件作为过程的协调器,并使用属性绑定在用户继续填充时从不同页面通知它所需的数据

IE在文件上传页面将上传的文件url绑定到属性,并在父级中观察:

<iron-pages>
    <file-upload-page url="{{url}}"></file-upload-page>
    <consumer-page></consumer-page>
</iron-pages>

<script>
    class Parent extends PolymerElement {

        // ...

        static get properties() {
            return {
                url: {
                    type: String,
                    reflectToAttribute: true,
                    observer: '_urlChanged',
                },
            };
        }

        _urlChanged() {
            console.log(this.url);
        }

        // ...
    }
</script>
正如您在consumer页面中所说的,您正在尝试访问sampleFileInput元素,它是另一个组件的子元素

所有这些尝试:

var temp2 = this.$.sampleFileInput;
var temp3 = this.shadowRoot.querySelector("#sampleFileInput"); 
var temp4 = this.root.querySelector('#sampleFileInput');
var temp5 = this.$$('#sampleFileInput');
var test1 = Polymer.dom(this).querySelector("#sampleFileInput");
失败,因为您正在尝试访问消费者页面模板中不存在的元素,而这些元素:

var test7 = document.querySelector('sampleFileInput');
var test8 = document.querySelector('file-upload-page::shadow .FileUploadPage');
分别失败,因为document.querySelector无法在shadow dom内部进行选择,并且不推荐使用::shadow和/deep/selector

从技术上讲,您应该能够通过以下方式在消费者页面内选择sampleFileInput:

this.parentElement // Goes back to iron-pages
    .querySelector('file-upload-page') // Selects file-upload-page
    .shadowRoot // Enters its shadow root
    .querySelector('#sampleFileInput'); // Selects the file uploader
然而,访问其他人的影子根目录中的元素被认为是一个挑战,更不用说,如果您对iron页面使用延迟加载,那么如果没有加载文件上载页面,这将失败

相反,有许多其他方法可以在自定义元素(如事件或属性)之外公开信息。 如果它适合您的实现,您可以使用包含iron页面的组件作为过程的协调器,并使用属性绑定在用户继续填充时从不同页面通知它所需的数据

IE在文件上传页面将上传的文件url绑定到属性,并在父级中观察:

<iron-pages>
    <file-upload-page url="{{url}}"></file-upload-page>
    <consumer-page></consumer-page>
</iron-pages>

<script>
    class Parent extends PolymerElement {

        // ...

        static get properties() {
            return {
                url: {
                    type: String,
                    reflectToAttribute: true,
                    observer: '_urlChanged',
                },
            };
        }

        _urlChanged() {
            console.log(this.url);
        }

        // ...
    }
</script>

Polymer 2默认为阴影DOM,而不是Polymer 1中的ShadyDOM默认值。您正在使用的查询选择器不会深入到阴影DOM中的子元素。我猜它包含一个元素,它试图获取对其中一个元素的引用。正确吗?Polymer 2默认为阴影DOM,而不是Polymer 1中的ShadyDOM默认值。您正在使用的查询选择器不会深入到阴影DOM中的子元素。我猜它包含一个元素,它试图获取对其中一个元素的引用。正确吗?谢谢Umbo,它的完整答案,它解决了问题并澄清了概念Umbo我喜欢你的第二种方法,但这里是我的场景,我正在上传一个文件,分享url将如何帮助,我不应该分享文件对象本身,因为文件已经上传到另一个页面。在这种方法中我是否遗漏了什么?当然,这取决于你的需要,url只是一个例子。所以你需要上传整个文件的内容吗?你可以尝试和url一样的方法,把整个内容传递给一个字符串,我猜?在属性或CustomEvent的详细信息中。感谢Umbo,它的完整答案,它解决了问题并澄清了概念Umbo我喜欢你的第二种方法,但这里是我的场景,我正在上载一个文件,共享url将有什么帮助,我不应该共享文件对象本身,因为文件已经上载到另一个页面中。在这种方法中我是否遗漏了什么?当然,这取决于你的需要,url只是一个例子。所以你需要上传整个文件的内容吗?你可以尝试和url一样的方法,把整个内容传递给一个字符串,我猜?在属性或CustomEvent的详细信息中。