如何从Javascript初始化Web组件?
假设我有以下web组件:如何从Javascript初始化Web组件?,javascript,html,web-component,Javascript,Html,Web Component,假设我有以下web组件: <link rel="import" href="my-dialog.htm"> <my-dialog id='mydialog1' heading="A Dialog">Lorem ipsum</my-dialog> 所以我不能通过属性在我的html中发送上述对象,因为我可能有很多设置和/或我可能在稍后从服务器获得它,所以我需要用javascript来完成 因此,我一直在做的是,我只是在创建对象之后获取它: // initial
<link rel="import" href="my-dialog.htm">
<my-dialog id='mydialog1' heading="A Dialog">Lorem ipsum</my-dialog>
所以我不能通过属性在我的html中发送上述对象,因为我可能有很多设置和/或我可能在稍后从服务器获得它,所以我需要用javascript来完成
因此,我一直在做的是,我只是在创建对象之后获取它:
// initialize is a function I have inside my web component
$('#mydialog1').get(0).initialize(obj);
^^这是可行的,初始化(..)是我的web组件中的一个函数。。但是:
问题#1我想知道这是否是初始化web组件的正确方法,因为它看起来有点凌乱。
此外,如果在代码中实例化web组件:
$('body').append("<my-dialog id='bla'></my-dialog>");
$('#bla').get(0).initialize(obj);
$('body')。追加(“”);
$('#bla').get(0).初始化(obj);
问题#2在第二行,我可以假设“bla”已经在这里创建了所有的方法吗?(很有趣,这是可行的,但我认为最好等待某种事件或组件准备好的东西)为什么要通过对象设置属性?我会进行设置,然后通过以下方式传递:
document.getElementById("someID").style.width = widthVar;
document.getElementById("someID").name = nameVar;
document.getElementById("someID").style.color = colorVar;
因为append有一个同步(与异步相反)行为,所以它总是可以工作的 不要用不必要的安全网(事件、轮询…)丢弃代码库
简而言之,在.append执行之后,元素就出现在DOM上,您可以使用选择器查询它,并对其执行任何操作。与几乎所有JavaScript方法一样,HTML追加是同步的,这意味着您可以期望在函数返回时构造正确的DOM元素-如果不是这样,函数将接受回调或返回承诺或类似内容。因此,您可以相信该对象已经创建并初始化它。以这种方式初始化它可能是最好的方法(尽管可能有一种方法可以在一行中完成这一切) 如果您觉得有必要让自己相信给定的导入方法(任何引用外部文件的方法)是同步的而不是异步的,那么您可以在*nix系统上执行以下操作:
yes
添加到其中。($yes>pipe1
)yes
(后面是换行符的无限系列y
s)的输出符合您的情况cat
)连接到该标题。($cat header.htm pipe1>pipe2.htm
)
或var x=require(“pipe2.js”)
)你的UI挂起了吗?如果是,那么它是同步的。它还在继续吗?然后它是异步的。而不是在html中创建它:
$('body').append("<my-dialog id='bla'></my-dialog>");
$('#bla').get(0).initialize(obj);
Web组件设计为通过其属性进行交互,这样它们就可以保持真正的互操作性 如果在将组件添加到DOM后获得数据,您仍然可以通过如下属性与web组件交互: 假设您已经将对话组件添加到DOM中:
<my-dialog id='mydialog1' heading="A Dialog">Lorem ipsum</my-dialog>
然后在web组件中,您可以对属性更改做出如下反应:
//Called when one of this components attributes change
proto.attributeChangedCallback = function(attrName, oldVal, newVal) {
switch (attrName) {
case "init-data":
//DO SOMETHING WITH newVal
var dataObj = JSON.parse(newVal);
break;
}
};
这会给你所需要的一切。我郑重建议您使用ES2015编写web组件。代码要干净得多,请参阅本教程:
希望这有帮助 这是什么技术?我们可以参考哪一页来了解更多信息?你有什么问题没有被那个页面回答?这是web组件吗?那好吧。您是否在询问如何将数据可靠地绑定到Web组件,而不必在实例化之前承担这样做的风险?是的。如果我通过代码正确地传递数据,或者如果有更好的方法,你不会在“created”回调中这样做吗?或者可能是“附加”回调?我不一定是在谈论样式设置。。它可以是“设置”对象中传递的任何内容。任何类型的数据。他说的是web组件,这是一种正在开发的将数据绑定到本机HTML的方法。@foreyez-您可以使用上述方法创建任何属性。我将创建一个脚本,然后使用键和值链接obj键,从而在元素上相应地设置它们。
<my-dialog id='mydialog1' heading="A Dialog">Lorem ipsum</my-dialog>
document.querySelector('#mydialog1').setAttribute('init-data', JSON.stringify(obj));
//Called when one of this components attributes change
proto.attributeChangedCallback = function(attrName, oldVal, newVal) {
switch (attrName) {
case "init-data":
//DO SOMETHING WITH newVal
var dataObj = JSON.parse(newVal);
break;
}
};