I'm writing a simple element that loads html files using Polymer 1.0's helper function importHref()
. The page loads in, but instead of the html rendering to the page, I'm getting [object HTMLDocument]
.
When I log the successful callback, the imported page is wrapped in a #document
object (not sure on the terminology here). But, the info is all there in the console.
So, my question is: How do I render the html to the page?
element:
<dom-module id="content-loader">
<template>
<span>{{fileContent}}</span>
</template>
<script>
Polymer({
is: "content-loader",
properties: {
filePath: {
type: String
}
},
ready: function() {
this.loadFile();
},
loadFile: function() {
var baseUrl;
if (!window.location.origin)
{
baseUrl = window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
else
{
baseUrl = window.location.origin;
}
//import html document and assign to fileContent
if(this.filePath)
{
this.importHref(baseUrl + this.filePath, function(file){
this.fileContent = file.target.import;
console.log(this.fileContent); //logs fine
},
function(error){
console.log(error);
});
}
}
});
</script>
in use:
<content-loader file-path="/app/general/contact.html"></content-loader>
I'm writing a simple element that loads html files using Polymer 1.0's helper function importHref()
. The page loads in, but instead of the html rendering to the page, I'm getting [object HTMLDocument]
.
When I log the successful callback, the imported page is wrapped in a #document
object (not sure on the terminology here). But, the info is all there in the console.
So, my question is: How do I render the html to the page?
element:
<dom-module id="content-loader">
<template>
<span>{{fileContent}}</span>
</template>
<script>
Polymer({
is: "content-loader",
properties: {
filePath: {
type: String
}
},
ready: function() {
this.loadFile();
},
loadFile: function() {
var baseUrl;
if (!window.location.origin)
{
baseUrl = window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
else
{
baseUrl = window.location.origin;
}
//import html document and assign to fileContent
if(this.filePath)
{
this.importHref(baseUrl + this.filePath, function(file){
this.fileContent = file.target.import;
console.log(this.fileContent); //logs fine
},
function(error){
console.log(error);
});
}
}
});
</script>
in use:
<content-loader file-path="/app/general/contact.html"></content-loader>
Share
Improve this question
edited Jun 25, 2015 at 20:28
anthony
asked Jun 25, 2015 at 14:59
anthonyanthony
90212 silver badges35 bronze badges
1 Answer
Reset to default 5<span>{{fileContent}}</span>
will render fileContent
cast to a String, which is why you see [object HTMLDocument]
(which is what you get when you call toString()
on a document
Object).
Just in general, Polymer won't let you bind to HTML or node content because it's a security risk.
The fileContent
you have is a document
, which means it's a collection of DOM nodes. How you use that document depends on what the content is that you loaded. One way to render the nodes is to append fileContent.body
onto your local DOM, like so:
Polymer.dom(this.root).appendChild(this.fileContent.body);
Here is a more plete example (http://jsbin./rafaso/edit?html,output):
<content-loader file-path="polymer/bower.json"></content-loader>
<dom-module id="content-loader">
<template>
<pre id="content"></pre>
</template>
<script>
Polymer({
is: "content-loader",
properties: {
filePath: {
type: String,
observer: 'loadFile'
}
},
loadFile: function(path) {
if (this.filePath) {
console.log(this.filePath);
var link = this.importHref(this.filePath,
function() {
Polymer.dom(this.$.content).appendChild(link.import.body);
},
function(){
console.log("error");
}
);
}
}
});
</script>
</dom-module>